找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 385|回复: 9

[每日一码] 点监视器不生成实体,使用屏幕向量画(描)实体拖动的实现

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-9-7 22:12:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 newer 于 2017-9-7 22:43 编辑

  1. (defun c:tt ()
  2.   (defun _callback (dynpt)
  3.     (if        (not (equal dynpt oldpnt 1e-4))
  4.       (progn
  5.              (setq mat (xdrx_matrix_settranslation (mapcar '- dynpt oldpnt)))
  6.              (xdrx_entity_transform ss mat)
  7.              (setq oldpnt dynpt)
  8.       )
  9.     )
  10.     (princ)
  11.   )
  12.   (xdrx_begin)
  13.   (if (and (setq ss (ssget))
  14.            (setq base (getpoint "\n基点<退出>:"))
  15.       )
  16.     (progn (xdrx_pointmonitor "_callback")
  17.            (if (setq p (getpoint "\n插入点:"))
  18.              (progn)
  19.            )
  20.     )
  21.   )
  22.   (xdrx_end)
  23.   (princ)
  24. )


上面代码是以前常用的,修改实体数据拖动的例子。

下面代码不修改实体数据,而是在屏幕上绘制(描)实体来实现,速度上应该更快。有点像AcedJig 拖动的样子了。

  1. (defun c:tt ()
  2.   (defun _callback (dynpt)
  3.     (if        (not (equal dynpt oldpnt 1e-4))
  4.       (progn
  5.              (setq mat (xdrx_matrix_settranslation (mapcar '- dynpt base)))
  6.              (xdrx_monitor_drawent ss mat)
  7.              (setq oldpnt dynpt)
  8.       )
  9.     )
  10.     (princ)
  11.   )
  12.   (xdrx_begin)
  13.   (if (and (setq ss (ssget))
  14.            (setq base (getpoint "\n基点<退出>:")))
  15.     (progn (xdrx_pointmonitor "_callback")
  16.            (if (setq p (getpoint "\n插入点:"))
  17.              (progn)
  18.            )
  19.     )
  20.   )
  21.   (xdrx_end)
  22.   (princ)
  23. )



xdrx_monitor_drawent 支持 曲线几何实体,参数类型可以是选择集,实体表。
下面是用GE实体,拖动

  1. (defun c:tt ()
  2.   (defun _callback (dynpt)
  3.     (if        (not (equal dynpt oldpnt 1e-4))
  4.       (progn
  5.              (setq mat (xdrx_matrix_settranslation (mapcar '- dynpt base)))
  6.              (xdrx_monitor_drawent g mat)
  7.              (setq oldpnt dynpt)
  8.       )
  9.     )
  10.     (princ)
  11.   )
  12.   (xdrx_begin)
  13.   (if (and (setq ss (car (entsel)))
  14.            (setq g (xdge::constructor ss))
  15.            (setq base (getpoint "\n基点<退出>:"))
  16.       )
  17.     (progn (xdrx_pointmonitor "_callback")
  18.            (if (setq p (getpoint "\n插入点:"))
  19.              (progn)
  20.            )
  21.     )
  22.   )
  23.   (xdrx_end)
  24.   (princ)
  25. )



点监视器DRAW.gif
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 58个

财富等级: 招财进宝

发表于 2017-9-7 23:36:30 来自手机 | 显示全部楼层
太神奇了 文字也是ge 实体么
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-9-8 00:01:49 | 显示全部楼层

文字不是GE, GE实体只是曲线。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5060个

财富等级: 富甲天下

发表于 2017-9-8 00:38:16 来自手机 | 显示全部楼层
这个牛,以前有人用纯lisp实现,没提供源码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8611个

财富等级: 富甲天下

发表于 2017-9-8 11:21:41 | 显示全部楼层
只能用xdrx_pointmonitor吗?xdrx_drag_jig不也是有监视点的作用?xdrx_pointmonitor支持关键字吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-9-8 12:06:32 | 显示全部楼层

当然支持关键字了,使用点监视器,和正常LISP没不同,自己用 initget设置关键字。或者用  (xdrx_initget ....)设置一键回车关键字。
函数库那些DRAG函数,都有关键字的,去看看 xd::drag:simplemove, xd::drag:getpoint,xd::drag:XXX那些函数的源码。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-9-8 12:13:41 | 显示全部楼层

xdrx_drag_jig 和 xdrx_pointmoniter 虽然都能拖动,但机理不一样,xdrx_drag_jig 用的是ARX的AcedJig类的DRAGEN技术,就是做拖动这件事的,它的关键字需要单独用这个类的函数设置,和INITGET不是一个。

点监视器里面的拖动,是你用回调函数实现的,自己写的实体变换代码,本质不只是做拖动这件事的,点监视器不知道你是在做“拖动”。它只是忠实的实现你的代码。除了变换实体,“画”实体,还可以获得鼠标位置的坐标,鼠标位置下面的实体,嵌套实体,显示光标,隐藏光标,跟随鼠标显示TOOLTIP,设置排除检查捕捉的实体等等,它是基于鼠标位置的功能扩展。总之,你要想做根据鼠标位置的事情,就用 点监视器。

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-9-8 12:23:41 | 显示全部楼层

使用纯LISP的,肯定有限制,LISP无非是用gevec画直线向量,用直线去模拟那些实体,对复杂的实体就无能为例了,比如TRUE TFF字体等等。
ARX使用的是AcGiViewPortDraw,核心的显示实体的的类,只要是生成出来的实体,都能画出来,因为你看到的实体的样子,就是这个核心去做的。“画”快,是因为不用去实现AcDbEntity类实体其他的属性,仅仅是在屏幕上画东西。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8611个

财富等级: 富甲天下

发表于 2017-9-8 15:51:56 | 显示全部楼层
好了,讲解的透彻,多谢大师
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-27 01:32 , Processed in 0.412790 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表