乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 81|回复: 7

[编程交流] 在多行中插入PI

[复制链接]

95

主题

477

帖子

383

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

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

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
475
发表于 2022-7-5 18:14:56 | 显示全部楼层
这是我目前的代码:
  1. (defun c:insertmlinepi (/        *insertmlinepians*
  2.   ent        mlinepts       plinepts
  3.   oldcmlscale    oldclayer      *error*
  4.         )
  5. (defun *error* (msg)
  6.    (if oldcmlscale
  7.      (setvar 'cmlscale oldcmlscale)
  8.    )
  9.    (if oldclayer
  10.      (setvar 'clayer oldclayer)
  11.    )
  12.    (if (not
  13.   (member msg '("Function cancelled" "quit / exit abort"))
  14. )
  15.      (princ (strcat "\nError: " msg))
  16.    )
  17.    (princ)
  18. )
  19. (insertmlinepi:settings)
  20. (if (and (setq ent (car (entsel "\nSelect MLINE: ")))
  21.    (= (cdr (assoc 0 (entget ent))) "MLINE")
  22.      )
  23.    (progn
  24.      (setq mlinevla (vlax-ename->vla-object ent))
  25.      (setq mlinescale (vlax-get mlinevla 'MLineScale)
  26.     mlinelayer (vlax-get mlinevla 'Layer)
  27.      )
  28.      (setq
  29. mlinepts (mapcar 'cdr
  30.    (vl-remove-if-not
  31.      (function (lambda (pt) (= (car pt) 10)))
  32.      (entget ent)
  33.    )
  34.   )
  35.      )
  36.      (setq oldcmljust (getvar 'cmljust))
  37.      (setvar 'cmljust mlinescale)
  38.      (setq oldclayer (getvar 'clayer))
  39.      (setvar 'clayer mlinelayer)
  40.      (command "._PLINE" (mapcar 'command pts))
  41.      (setq plinelast (entlast))
  42.      (if (= *insertmlinepians* "Insert")
  43. (progn
  44.   (command "._INSERTFEATUREPI" plinelast)
  45.   (while (> (logand (getvar "CMDACTIVE") 1) 0)
  46.     (command PAUSE)
  47.   )
  48. )
  49. (progn
  50.   (command "._DELETEFEATUREPI" plinelast)
  51.   (while (> (logand (getvar "CMDACTIVE") 1) 0)
  52.     (command PAUSE)
  53.   )
  54. )
  55.      )
  56.      (setq
  57. plinepts (mapcar 'cdr
  58.    (vl-remove-if-not
  59.      (function (lambda (pt) (= (car pt) 10)))
  60.      (entget plinelast)
  61.    )
  62.   )
  63.      )
  64.      (command "._mline" (foreach pt pts (command pt)))
  65.      (setvar 'cmlscale oldcmlscale)
  66.      (setvar 'clayer oldclayer)
  67.    )
  68. )
  69. (princ)
  70. )
  71. ;;;This is the settins portion of the code
  72. (defun insertmlinepi:settings ()
  73. (initget "Insert Delete")
  74. (setq *insertmlinepians*
  75. (cond
  76.    ((getkword
  77.       "\nDo you want to [insert/Delete] PI <Insert>: "
  78.     )
  79.    )
  80.    ("Insert")
  81. )
  82. )
  83. )

我的问题是,我似乎无法从多线图中正确提取点来绘制pline,并且我不确定我的代码在插入或删除PI后是否实际获得了修改后的点。有人对我做错了什么有什么建议吗?
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:21:20 | 显示全部楼层
另一种方法可能是,在不同的情况下,使用偏移等拖动多条线,绘制尽可能多的多条线。这提供了所有这些线的详细信息,层间距等。因此,在1之外进行编辑,然后可以删除所有其他线,并重新偏移,以在正确的层上创建新的线等
回复

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
475
发表于 2022-7-5 18:31:11 | 显示全部楼层
这是我一段时间以来一直在做的事情,而不是处理mlines,但当其他人编辑图形时,它最终导致了更多的头痛。
回复

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
475
发表于 2022-7-5 18:43:32 | 显示全部楼层
我一直在研究while循环,我不知道我做错了什么,因为它没有绘制mline。obj是在代码的前面已经选择的pline。
  1. (while (command "._INSERTFEATUREPI" obj PAUSE)
  2.    (setq obj (entlast))
  3.    (if mobj
  4.      (command "._erase" mobj)
  5.      )
  6.     (setq pts (mapcar 'cdr
  7.   (vl-remove-if-not
  8.     (function (lambda (pt) (= (car pt) 10)))
  9.     (entget obj)
  10.   )
  11. )
  12.      )
  13.    (command "._mline" (foreach pt pts (command pt)))
  14.    (setq mobj (entlast))
  15.    )
回复

使用道具 举报

5

主题

956

帖子

963

银币

初来乍到

Rank: 1

铜币
35
发表于 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)))
回复

使用道具 举报

95

主题

477

帖子

383

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
475
发表于 2022-7-5 18:59:54 | 显示全部楼层
韩,非常感谢你的帮助!所以我尝试使用dxf代码11,但它在错误的位置绘制了多线图。我试过了
  1. (setq entlist (entget ent))
  2.      (setq mlinepts (assoc 11 entlist))
  3.      (command "._PLINE" (mapcar 'command mlinepts))
回复

使用道具 举报

5

主题

956

帖子

963

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 19:03:58 | 显示全部楼层
 
只需替换前面代码中的索引
  1.   (setq
  2. mlinepts (mapcar 'cdr
  3.    (vl-remove-if-not
  4.      (function (lambda (pt) (= (car pt) [color="red"][b]11[/b][/color])))
  5.      (entget ent)
  6.    )

 
 
1.我不是很确定,但有时osmode在代码中使用命令绘制对象时会导致错误,这就是我习惯于使用enting的原因
 
2.如果您在不同的UCS中工作,请使用函数trans
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-13 01:07 , Processed in 0.540910 second(s), 68 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表