如何用lisp获得一个INSERT中子物体的图元名
1个回答
展开全部
;;;首先获得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就可以了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询