iJero 发表于 2018-11-8 21:54:08

如何得到一个命令完成后所绘制的所有图元

比如,我用LINE命令画线段,我想将本次命令所画的所有line图元都收集到一个选择集里面,该如何实现?
我用(getlast)只能得到最后一段线段。:(

yshf 发表于 2018-11-10 08:56:11

本帖最后由 yshf 于 2018-11-10 09:39 编辑

(setq ent (entlast));取调用命令前的最后一个图元
(command ... );调用命令
(setq ssa (ssadd));建立一个空选择集
(while (setq ent (entnext ent));如果下一个图元不为nil
    (setq ssb (ssadd ent ssb));则将其加入选择集中
)
或者:
(setq ModelSpace (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
(setq N0 (vla-get-Count ModelSpace));调用命令前模型空间中的图元总个数
(command ... );调用命令
(setq N1 (vla-get-Count ModelSpace));调用命令后模型空间中的图元总个数
(if (> N1 N0)
      (progn
          (setq ssa (ssadd));建立一个空选择集
          (setq i 0)
          (repeat (- N1 N0);将调用命令后所绘制的图元逐一加入选择集中
               (setq ssa (ssadd (vlax-vla-object->ename (vla-item ModelSpace (+ N0 i))) ssa))
               (setq i (1+ i))
          )
   )
)

;;;选择集ssa中的图元即调用命令后所绘制的所有图元

ssyfeng 发表于 2018-11-9 08:55:27

可以用这个函数,画图前,先得到当前最后一个图元名,再进行绘图,画完再用这个函数就可以得到所有图元的选择集了

;;说明:xyp-SSelEntnext 返回某图元后的图元选择集 (xyp-SSelEntnext s0实体名)
;;参数:s0:实体名
;;返回:图元选择集
(defun xyp-SselEntnext (s0 / ss)
(setq ss (ssadd))
(while (setq s0 (entnext s0))
    (setq ss (ssadd s0 ss))
)
(if (/= (sslength ss) 0)
    ss
)
)

iJero 发表于 2018-11-9 22:19:40

edata 发表于 2018-11-9 12:21
没有特殊需要,不建议用command,
你可以尝试 entmakex 创建直线

长老,我是想调用别的软件公司二次开发后的命令。
按上述兄弟们推荐的方法,在ACad内部命令是是可行的,但对于二次开发的命令却是不行 ,失败了

panliang9 发表于 2018-11-9 08:27:11

新建一个空块,同时进入块的在位编辑状态,这时,下面你画的所有对象都位于这个空白块里了,后面如果不用想块了,可以将这个块炸开成组。这些对象就位于这个组里了。

水吉空 发表于 2018-11-9 09:34:38

收集图形,用entlast、while函数

iJero 发表于 2018-11-9 09:51:28

ssyfeng 发表于 2018-11-9 08:55
可以用这个函数,画图前,先得到当前最后一个图元名,再进行绘图,画完再用这个函数就可以得到所有图元的选 ...

先确定起始点,再得到终点,再截取。
谢谢

iJero 发表于 2018-11-9 09:51:57

水吉空 发表于 2018-11-9 09:34
收集图形,用entlast、while函数

不是很清楚你的具体做法,能明示一下吗?
谢谢

edata 发表于 2018-11-9 12:21:30

没有特殊需要,不建议用command,
你可以尝试 entmakex 创建直线

iJero 发表于 2018-11-10 10:41:21

yshf 发表于 2018-11-10 08:56
(setq ent (entlast));取调用命令前的最后一个图元
(command ... );调用命令
(setq ssa (ssadd));建立一 ...

已解决,谢谢!
页: [1] 2
查看完整版本: 如何得到一个命令完成后所绘制的所有图元