Happy Hobbit 发表于 2022-7-5 18:11:07

创建用户系统变量?

我有一个简单的lisp,可以删除A3标题栏某些坐标内的文本/多行文字对象,效果很好:
(defun C:DTX (/ ss)
(if (setq ss (ssget "_W" '(15 35) '(400 40) '((0 . "*TEXT"))))
   (command "_.erase" ss "")
   (alert "TEXT Not Found")
);; End if
(princ)
)
然而,当涉及到A0、A1和A2边界及其各种比例时,需要更改坐标['(15 35)'(400 40)],或创建单独的lisp。现在可以很容易地将上述坐标存储在两个变量中,但是我们需要这些变量的值在不同的图形中或重新启动后保持不变。
我的想法是创建两个lisp可以读取的系统变量&可以使用带有getpoint函数的单独lisp更改SV。有人试图创建具有半永久值的系统变量或全局变量吗?

Lee Mac 发表于 2022-7-5 18:19:04

假设在整个图形中,比例为1:1的边界尺寸是一致的?若是这样,你们可以在程序中定义1:1比例块的坐标,然后根据每个图形中块的比例、位置和旋转来缩放/重新定位/旋转这些坐标。
 
或者,可以将精确的坐标存储在图形字典中,但这似乎没有意义,因为如果以任何方式修改标题栏的位置/比例/旋转,则存储的数据将变得无效。

Happy Hobbit 发表于 2022-7-5 18:26:49

不幸的是,边界具有不同的比例,A1和A2的范围从1:1到1:6,所有比例介于两者之间(一些NT),图形比例在每个集合内通常是相同的,因此我的想法是在发布一组具有相同比例的图形时重置删除区域的坐标。我们通常的方法是滚动浏览每张图纸,删除日期、ECN、“by”和发行说明等信息,然后粘贴到新信息中,我已经在标题栏中使用diesel半自动地将其粘贴到标题栏中,该标题栏检测到发行前的字母(A、B、C…)从新文件名(例如912 15B)和粘贴、保存的lisp,然后滚动到下一个打开的图形,其中可能有60-100个。
我的想法是打开特定问题的所有图形,然后设置删除区域的坐标(如果需要),然后将defun DTX合并到lisp中,该lisp可以删除、粘贴、保存,然后滚动到集中的下一个图形。只是在图纸上存储坐标给我带来了困难

Lee Mac 发表于 2022-7-5 18:35:18

 
如上所述,如果在图形中使用相同的边界块,则边界比例无关紧要-图形中边界的比例/位置/旋转的差异无关紧要,因为可以相应地变换窗口坐标。

Happy Hobbit 发表于 2022-7-5 18:38:55

 
我想这可能就是我想要的答案,所有的T块在整个集合中都是相同的比例,插入点总是0,0
 
我确实考虑过使用一个简单的文本文件来读/写,使用一个单独的lisp,但是“绘图字典”听起来更好。唯一的问题是我从来没有听说过它们,更不用说用过了

Lee Mac 发表于 2022-7-5 18:50:54

你会看到的,但这个选项似乎比我上面建议的解决方案复杂得多。

Happy Hobbit 发表于 2022-7-5 18:52:29

我认为你是对的,李,我决定使用另一个选项,它仍在编码中,但似乎工作正常。我必须试试&可能会稍微调整一下坐标&可能是我不在工作时记不起来的块名:
 
(defun c:testb ( / a1ll a1ur a2ll a2ur a3ll a3ur blk blkn i ll n scl ss ssw ur)
(setq a1ll '(425 49))
(setq a1ur '(685 56))
(setq a2ll '(178 49))
(setq a2ur '(438 56))
(setq a3ll '(12 49))
(setq a3ur '(275 56))

(setq ss (ssget "_X" '((0 . "INSERT"))))
(setq i 0)
(repeat (sslength ss)
(setq blk (entget(ssname ss i)))
(cond
          ((wcmatch (cdr (assoc 2 blk)) "A1*")
           (setq blkn (cdr (assoc 2 blk)))
           (setq scl (cdr (assoc 41 blk)))
           (setq ll (mapcar '(lambda (n) (* n scl)) a1ll))
           (setq ur (mapcar '(lambda (n) (* n scl)) a1ur))
          )
          ((wcmatch (cdr (assoc 2 blk)) "A2*")
           (setq blkn (cdr (assoc 2 blk)))
           (setq scl (cdr (assoc 41 blk)))
           (setq ll (mapcar '(lambda (n) (* n scl)) a2ll))
           (setq ur (mapcar '(lambda (n) (* n scl)) a2ur))                  
          )
)          
(setq i (1+ i))
)
    (princ (strcat "\nBlock Name is: "blkn))
    (princ (strcat "\nScale = " (rtos scl)))
(if (setq ssw (ssget "_W" ll ur '((0 . "TEXT"))))
    (command "_.erase" ssw "")
    (alert "TEXT Not Found")
);; End if
(princ)
)

Lee Mac 发表于 2022-7-5 19:02:03

我将按以下方式构造代码:
上述未经测试,假设块是非动态的、均匀缩放的,并且始终插入零旋转的原点。

Happy Hobbit 发表于 2022-7-5 19:07:26

感谢Lee,比我的简洁多了,让我放心的是,我或多或少都正确地掌握了很多功能(尤其是使用mapcar/lambda函数将坐标乘以比例!)
他们是

BlackBox 发表于 2022-7-5 19:16:50

Lee已经为您所需的任务指明了正确的方向,因此我唯一能提供的就是,让您能够创建自定义系统变量——为此,请考虑自动加载机制:
 
https://knowledge.autodesk.com/support/autocad/downloads/caas/CloudHelp/cloudhelp/2015/ENU/AutoCAD-Customization/files/GUID-3C25E517-8660-4BB7-9447-2310462EF06F-htm.html
 
 
干杯
页: [1]
查看完整版本: 创建用户系统变量?