如何用lisp获得一个INSERT中子物体的图元名

 我来答
悄悄de爱上
2017-08-17 · TA获得超过2050个赞
知道小有建树答主
回答量:597
采纳率:66%
帮助的人:342万
展开全部
;;;首先获得INSERT的2组码信息:
(setq @iName (cdr(assoc -2(entget(car(entsel"\n选取图面上的块:"))))))
;;;比如返回值为"myBlock"
之后查询block中组码相同的信息:
(setq @bEnt (tblobjname "block" @iName))
;;;由此获得insert对应的block图元名。
之后用entget获取@bEnt组码-2里包含的图元
(setq @child (cdr(assoc -2(entget @bEnt))))
;;;此时@child就是insert中第一个图元的图元名,继续entget可以获得详细信息:
(entget @child)
;;;如果要获取insert是由多个图形组成,要获取中第二个或者第三个图元或者更多:
;;;第二个图元图元名:(entnext @child)
;;;第三个图元图元名:(entnext (entnext @child))
;;;第四个图元图元名:(entnext(entnext (entnext @child)))
;;;……
;;;由此规律,可以写一个简单的函数来获取固定第几个图元的图元名
(defun GETOBJ(#num / @@gtEt)
  (setq @@gtEt "@child");定义一个基础字符串
  (if (>= #num 1)(fix #num)(exit));错误处理部分,如果#num<1或者不为数字,则退出
  (repeat #num ;循环#num"整数部分"次
    (setq @@gtEt (strcat "(entnext" @@gtEt ")"));将字符串@@gtEt前加"(entnext",后加")"
  )
  (eval (read @@gtEt));用read转换@@gtEt为表,并用eval执行该表
)
;;;由此,(GETOBJ 10)可以获得@child后第10个图元的图元名。如果要查看详细信息,则:
(entget(GETOBJ 10))
;;;====================================================================================
;;;汇总整段代码:
(defun GETOBJ(#num / @@gtEt)
  (setq @@gtEt "@child")
  (repeat #num
    (setq @@gtEt (strcat "(entnext" @@gtEt ")"))
  )
  (eval (read @@gtEt))
)
(defun c:INSOBJ(/ @num @iName @bEnt )
  (setq @iName (cdr(assoc -2(entget(car(entsel"\n选取图面上的块:"))))))
  (setq @bEnt (tblobjname "block" @iName))
  (setq @child (cdr(assoc -2(entget @bEnt))))
  (setq @num (getint "\n输入获取的图元序号:"))
  (if (< @num 0)
    (progn
      (princ "\n序号必须不小于0。")
      (exit)
    )
  )
  (if (= @num 0)(entget @child))
  (if (> @num 0)(entget(GETOBJ @num)))
  (princ)
)
;;;以上,调用后CAD输入INSOBJ就可以了。
光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式