在多行中插入PI
我对MLINES最恼火的一点是,他们太难相处了。您不能将PI插入其中,因此如果有任何更改(需要添加或删除PI),您必须完全重新绘制它们。在LISP中是否有方法添加从多行线添加/删除PI的功能?关于如何做这件事,我有两种不同的想法。1) 尝试制作一个反应器,在第一次绘制多线时将其与多线关联,以便在多线中添加PI、拖动等。然后编辑或重画多线,以便插入PI。2) 该例程将绘制一条跟随多线的多段线。这样,用户可以使用INSERTFEATUREPI命令将PI插入到mline中,然后我将基于多段线重新绘制mline。你认为哪种方式更容易/更人性化? 这是我目前的代码:(defun c:insertmlinepi (/ *insertmlinepians*
ent mlinepts plinepts
oldcmlscale oldclayer *error*
)
(defun *error* (msg)
(if oldcmlscale
(setvar 'cmlscale oldcmlscale)
)
(if oldclayer
(setvar 'clayer oldclayer)
)
(if (not
(member msg '("Function cancelled" "quit / exit abort"))
)
(princ (strcat "\nError: " msg))
)
(princ)
)
(insertmlinepi:settings)
(if (and (setq ent (car (entsel "\nSelect MLINE: ")))
(= (cdr (assoc 0 (entget ent))) "MLINE")
)
(progn
(setq mlinevla (vlax-ename->vla-object ent))
(setq mlinescale (vlax-get mlinevla 'MLineScale)
mlinelayer (vlax-get mlinevla 'Layer)
)
(setq
mlinepts (mapcar 'cdr
(vl-remove-if-not
(function (lambda (pt) (= (car pt) 10)))
(entget ent)
)
)
)
(setq oldcmljust (getvar 'cmljust))
(setvar 'cmljust mlinescale)
(setq oldclayer (getvar 'clayer))
(setvar 'clayer mlinelayer)
(command "._PLINE" (mapcar 'command pts))
(setq plinelast (entlast))
(if (= *insertmlinepians* "Insert")
(progn
(command "._INSERTFEATUREPI" plinelast)
(while (> (logand (getvar "CMDACTIVE") 1) 0)
(command PAUSE)
)
)
(progn
(command "._DELETEFEATUREPI" plinelast)
(while (> (logand (getvar "CMDACTIVE") 1) 0)
(command PAUSE)
)
)
)
(setq
plinepts (mapcar 'cdr
(vl-remove-if-not
(function (lambda (pt) (= (car pt) 10)))
(entget plinelast)
)
)
)
(command "._mline" (foreach pt pts (command pt)))
(setvar 'cmlscale oldcmlscale)
(setvar 'clayer oldclayer)
)
)
(princ)
)
;;;This is the settins portion of the code
(defun insertmlinepi:settings ()
(initget "Insert Delete")
(setq *insertmlinepians*
(cond
((getkword
"\nDo you want to PI <Insert>: "
)
)
("Insert")
)
)
)
我的问题是,我似乎无法从多线图中正确提取点来绘制pline,并且我不确定我的代码在插入或删除PI后是否实际获得了修改后的点。有人对我做错了什么有什么建议吗? 另一种方法可能是,在不同的情况下,使用偏移等拖动多条线,绘制尽可能多的多条线。这提供了所有这些线的详细信息,层间距等。因此,在1之外进行编辑,然后可以删除所有其他线,并重新偏移,以在正确的层上创建新的线等 这是我一段时间以来一直在做的事情,而不是处理mlines,但当其他人编辑图形时,它最终导致了更多的头痛。 我一直在研究while循环,我不知道我做错了什么,因为它没有绘制mline。obj是在代码的前面已经选择的pline。
(while (command "._INSERTFEATUREPI" obj PAUSE)
(setq obj (entlast))
(if mobj
(command "._erase" mobj)
)
(setq pts (mapcar 'cdr
(vl-remove-if-not
(function (lambda (pt) (= (car pt) 10)))
(entget obj)
)
)
)
(command "._mline" (foreach pt pts (command pt)))
(setq mobj (entlast))
) 响应OP的第一个代码
我们的版本(ac2007)没有:
“.u DELETEFEATUREPI”
“.u INSERTFEATUREPI”
所以我无能为力,假设这些命令在你的机器上运行
试着调试逻辑、拼写等。。
1.您首先应该(setq oldcmlscale(getvar'cmlscale))
2.insertmlinepi:settings,*insertmlinepians*是全局的,
但是在c:insertmlinepi中,它是本地化的(即:总是返回零)应该放在全局吗?
3.对于mlinepts,您是否尝试了dxf索引11?
(FWIW:vla get-MLineScale和‘层相似dxf assoc 40和8)
4.pts=MLINETS,用于命令“_pline”
*5.pts=plinepts(命令“_mline”(foreach pt plinepts(命令pt))) 韩,非常感谢你的帮助!所以我尝试使用dxf代码11,但它在错误的位置绘制了多线图。我试过了
(setq entlist (entget ent))
(setq mlinepts (assoc 11 entlist))
(command "._PLINE" (mapcar 'command mlinepts))
只需替换前面代码中的索引
(setq
mlinepts (mapcar 'cdr
(vl-remove-if-not
(function (lambda (pt) (= (car pt) 11)))
(entget ent)
)
1.我不是很确定,但有时osmode在代码中使用命令绘制对象时会导致错误,这就是我习惯于使用enting的原因
2.如果您在不同的UCS中工作,请使用函数trans
页:
[1]