明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4530|回复: 6

[已解答] 求证entsel、nentsel、nentselp返回图元名的区别

[复制链接]
发表于 2015-10-16 14:12:42 | 显示全部楼层 |阅读模式
  1. ;;; 求证entsel、nentsel、nentselp返回图元名的区别
  2. ;;; 已知(car(entsel))、(car(nentsel))、(car(nentselp))都可返回图元名.
  3. ;;; 但下面的测试程序让我迷惑不解
  4. ;;;
  5. ;;; 程序目的:获取某点到曲线的垂点
  6. ;;; 运行环境: win7x64 + cad2012
  7. ;;;
  8. ;;; 点选图中的白色圆(或白色直线)程序正常
  9. (vlax-curve-getClosestPointTo
  10.   (car(entsel"\n点选圆:"))
  11.   (getpoint"\n点取任一点:")
  12.   nil) ;有返回值.
  13. ;;;
  14. (vlax-curve-getClosestPointTo
  15.   (car(nentsel"\n点选圆:"))
  16.   (getpoint"\n点取任一点:")
  17.   nil) ;有返回值.
  18. ;;;
  19. (vlax-curve-getClosestPointTo
  20.   (car(nentselp"\n点选圆:"))
  21.   (getpoint"\n点取任一点:")
  22.   nil) ;有返回值.

  23. ;;; 点选图中的红色曲线时,用entsel方式正常,其余无,也或不报错
  24. (vlax-curve-getClosestPointTo
  25.   (car(entsel"\n点选红色曲线:"))
  26.   (getpoint"\n点取任一点:")
  27.   nil) ;有返回值.
  28. ;;;
  29. (vlax-curve-getClosestPointTo
  30.   (car(nentsel"\n点选红色曲线:"))
  31.   (getpoint"\n点取任一点:")
  32.   nil) ;报错; 错误: 参数值错误: AcDbCurve 80
  33. ;;;
  34. (vlax-curve-getClosestPointTo
  35.   (car(nentselp"\n点选红色曲线:"))
  36.   (getpoint"\n点取任一点:")
  37.   nil) ;无返回值,也不报错.

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

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

本帖子中包含更多资源

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

x

点评

(nentselp)=(car(nentsel))  发表于 2015-10-17 10:57
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2015-10-16 15:44:55 | 显示全部楼层
对于简单实体,entsel、nentsel、nentselp结果相同,对于复杂实体,三者是有区别的
 楼主| 发表于 2015-10-17 08:17:23 | 显示全部楼层
lijiao 发表于 2015-10-16 15:44
对于简单实体,entsel、nentsel、nentselp结果相同,对于复杂实体,三者是有区别的

能详细帮忙说明一下吗,先谢谢了
发表于 2015-10-19 09:10:10 | 显示全部楼层
看帮助啊!论坛里面也有现存的
 楼主| 发表于 2015-10-19 10:01:52 | 显示全部楼层
lijiao 发表于 2015-10-19 09:10
看帮助啊!论坛里面也有现存的

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

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

(nentsel [msg])
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 开发人员手册中》的 图元名称函数。

 楼主| 发表于 2015-10-19 10:07:45 | 显示全部楼层
确实,用entsel、nentsel、nentselp分别点取同一"POLYLINE"实体,所返回的图元名不相同


发表于 2018-10-9 21:45:22 | 显示全部楼层
怎么实现框选用nentselp函数进行框选参考的图,跟ssget用法一样。因为ssget没办法框选参考里面的内容
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-1 05:48 , Processed in 0.178599 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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