USER2128 发表于 2015-10-16 14:12:42

求证entsel、nentsel、nentselp返回图元名的区别

;;; 求证entsel、nentsel、nentselp返回图元名的区别
;;; 已知(car(entsel))、(car(nentsel))、(car(nentselp))都可返回图元名.
;;; 但下面的测试程序让我迷惑不解
;;;
;;; 程序目的:获取某点到曲线的垂点
;;; 运行环境: win7x64 + cad2012
;;;
;;; 点选图中的白色圆(或白色直线)程序正常
(vlax-curve-getClosestPointTo
(car(entsel"\n点选圆:"))
(getpoint"\n点取任一点:")
nil) ;有返回值.
;;;
(vlax-curve-getClosestPointTo
(car(nentsel"\n点选圆:"))
(getpoint"\n点取任一点:")
nil) ;有返回值.
;;;
(vlax-curve-getClosestPointTo
(car(nentselp"\n点选圆:"))
(getpoint"\n点取任一点:")
nil) ;有返回值.

;;; 点选图中的红色曲线时,用entsel方式正常,其余无,也或不报错
(vlax-curve-getClosestPointTo
(car(entsel"\n点选红色曲线:"))
(getpoint"\n点取任一点:")
nil) ;有返回值.
;;;
(vlax-curve-getClosestPointTo
(car(nentsel"\n点选红色曲线:"))
(getpoint"\n点取任一点:")
nil) ;报错; 错误: 参数值错误: AcDbCurve 80
;;;
(vlax-curve-getClosestPointTo
(car(nentselp"\n点选红色曲线:"))
(getpoint"\n点取任一点:")
nil) ;无返回值,也不报错.

;;; 将 (car(nentsel"\n点选红色曲线:")) 换成
;;; (vlax-ename->vla-object (car(nentsel"\n点选红色曲线:")))
;;; 也不行

;;; 请教高手这其中的玄机,或是某个函数的BUG.
;;; (car(entsel)、(car(nentsel)、(car(nentselp)究竟有何区别.
;;; 谢谢

lijiao 发表于 2015-10-16 15:44:55

对于简单实体,entsel、nentsel、nentselp结果相同,对于复杂实体,三者是有区别的

USER2128 发表于 2015-10-17 08:17:23

lijiao 发表于 2015-10-16 15:44 static/image/common/back.gif
对于简单实体,entsel、nentsel、nentselp结果相同,对于复杂实体,三者是有区别的

能详细帮忙说明一下吗,先谢谢了

lijiao 发表于 2015-10-19 09:10:10

看帮助啊!论坛里面也有现存的

USER2128 发表于 2015-10-19 10:01:52

lijiao 发表于 2015-10-19 09:10 static/image/common/back.gif
看帮助啊!论坛里面也有现存的

谢谢 lijiao
http://www.mjtd.com/helpcenter/autolisp/ALR.default.168.htm

提示用户指定点来选择对象(图元),得到这个对象所指片段的对象名

(nentsel )
nentsel 函数提示用户选择一个对象。除非用户专门指定,否则它将忽略当前的对象捕捉模式。为了给命令行提供更多的支持,nentsel 函数支持以前用 initget 定义的关键字。

参数

msg
用作提示信息的字符串。如果省略该参数,则显示“选择对象”提示。

返回值

如果用户选择的不是复杂对象(如三维多段线或块),nentsel 函数返回的信息与 entsel 函数相同。然而,如果所选对象是三维多段线,nentsel 函数返回一个表,其中包含子图元(顶点)名和拾取点坐标。这与 entsel 函数返回的表类似,不同的是 nentsel 函数返回的是三维多段线的所选顶点名,而不是多段线的头部图元名。nentsel 函数总是返回选定多段线段的起始顶点,例如,拾取某多段线的第三段,返回的是该多段线的第三个顶点。nentsel 函数从不返回三维多段线的 SEQEND 图元。

注意 在图形数据库中,优化多段线定义为简单图元。它不包含子图元。

选择块参照中的属性时,nentsel 返回该属性的属性名和拾取点坐标。如果选取的是块参照的一个部件而不是属性,nentsel 返回一个包含四个元素的表。

拾取了块中的对象而返回的表中,第一个元素是被选中图元的图元名,第二个元素是一个表,其中包含用户拾取该对象时指定点的坐标。

第三个元素称为模型坐标系到世界坐标系的转换矩阵,它是一个包含四个子表的表,四个子表中的每一个都包含了一个坐标集。该矩阵可以用来将图元定义数据中的点从称为模型坐标系 (MCS) 的内部坐标系转换为世界坐标系 (WCS)。MCS 的原点是包含所选图元的块的插入点,而 MCS 轴的方向则由创建该块时 UCS 的方向决定。

注意 nentsel 是唯一一个使用这种类型矩阵的 明经通道 AutoLISP 函数。nentselp 函数返回的矩阵与其他 AutoLISP 和 ObjectARX 函数使用的矩阵类似。

第四个元素是一个表,它包含了选定对象所在块的图元名。若所选的对象内含在嵌套块中(即块中块),则该表会包括内含该对象的所有块的图元名。该表的排列顺序是从最内层的块开始,向外层推,直到遇到插入图形中的最外层块才结束。

关于将 MCS 坐标转换为 WCS 坐标的信息,请参见《Visual LISP 开发人员手册》的 用 AutoLISP 操纵 AutoCAD 对象 一章中的 图元上下文和坐标转换数据。

示例

使用线段来绘制一条三维多段线,然后加载并执行下列函数,选择直线的不同线段。取消拾取某条线段,然后重新拾取它,以此来观察子图元的处理。然后在一条优化多段线上重复上述操作,观察其中的区别。

(defun c:subent ()
(while   
   (setq Ent (entsel "\nPick an entity: "))
   (print (strcat "Entity handle is: "
          (cdr (assoc 5 (entget (car Ent))))))
   )
   (while   
      (setq Ent (nentsel "\nPick an entity or subEntity: "))
      (print (strcat "Entity or subEntity handle is:"
          (cdr (assoc 5 (entget (car Ent))))))
   )
(prompt "\nDone.")
(princ)
)
参阅

entsel、initget 和 nentselp 函数以及 《Visual LISP 开发人员手册中》的 图元名称函数。

USER2128 发表于 2015-10-19 10:07:45

确实,用entsel、nentsel、nentselp分别点取同一"POLYLINE"实体,所返回的图元名不相同


583775698 发表于 2018-10-9 21:45:22

怎么实现框选用nentselp函数进行框选参考的图,跟ssget用法一样。因为ssget没办法框选参考里面的内容
页: [1]
查看完整版本: 求证entsel、nentsel、nentselp返回图元名的区别