broncos15 发表于 2022-7-5 18:03:50

在多行中插入PI

我对MLINES最恼火的一点是,他们太难相处了。您不能将PI插入其中,因此如果有任何更改(需要添加或删除PI),您必须完全重新绘制它们。在LISP中是否有方法添加从多行线添加/删除PI的功能?关于如何做这件事,我有两种不同的想法。1) 尝试制作一个反应器,在第一次绘制多线时将其与多线关联,以便在多线中添加PI、拖动等。然后编辑或重画多线,以便插入PI。2) 该例程将绘制一条跟随多线的多段线。这样,用户可以使用INSERTFEATUREPI命令将PI插入到mline中,然后我将基于多段线重新绘制mline。你认为哪种方式更容易/更人性化?

broncos15 发表于 2022-7-5 18:14:56

这是我目前的代码:

(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后是否实际获得了修改后的点。有人对我做错了什么有什么建议吗?

BIGAL 发表于 2022-7-5 18:21:20

另一种方法可能是,在不同的情况下,使用偏移等拖动多条线,绘制尽可能多的多条线。这提供了所有这些线的详细信息,层间距等。因此,在1之外进行编辑,然后可以删除所有其他线,并重新偏移,以在正确的层上创建新的线等

broncos15 发表于 2022-7-5 18:31:11

这是我一段时间以来一直在做的事情,而不是处理mlines,但当其他人编辑图形时,它最终导致了更多的头痛。

broncos15 发表于 2022-7-5 18:43:32

我一直在研究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))
   )

hanhphuc 发表于 2022-7-5 18:47:28

响应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)))

broncos15 发表于 2022-7-5 18:59:54

韩,非常感谢你的帮助!所以我尝试使用dxf代码11,但它在错误的位置绘制了多线图。我试过了
(setq entlist (entget ent))
   (setq mlinepts (assoc 11 entlist))
   (command "._PLINE" (mapcar 'command mlinepts))

hanhphuc 发表于 2022-7-5 19:03:58

 
只需替换前面代码中的索引
(setq
mlinepts (mapcar 'cdr
   (vl-remove-if-not
   (function (lambda (pt) (= (car pt) 11)))
   (entget ent)
   )
 
 
1.我不是很确定,但有时osmode在代码中使用命令绘制对象时会导致错误,这就是我习惯于使用enting的原因
 
2.如果您在不同的UCS中工作,请使用函数trans
页: [1]
查看完整版本: 在多行中插入PI