mdbdesign 发表于 2022-7-6 04:35:05

标记多线样式的字段

创建许多多线样式以绘制车间细节的管道。
现在我有点迷失了,哪一个是哪一个。
我认为field是我为所有使用的管道(多线样式)添加标签的解决方案。
手动可以,但我需要加快标记过程。
因为这是我第一次接触菲尔德,我又迷路了。
字段宏(?)如下所示(从字段对话框):
(%<\AcObjProp Object(%<\_ObjId 2128066088>%).StyleName \f "%tc1">%)其中红色部分是对象ID。
尝试编写脚本,但在打开字段的对话框时停止。
有没有自动化标签的想法?
例如:
按钮(命令)
选择对象
拾取插入点
...然后转到下一个。
非常感谢。

Lee Mac 发表于 2022-7-6 04:43:20

我认为Field命令没有命令行版本,因此需要使用ActiveX方法创建字段。
 
下面是一个快速示例:
 
(defun c:mlfield ( / dc en pt )
   (while
       (progn
         (while
               (progn (setvar 'ERRNO 0) (setq en (car (entsel "\nSelect MLine: ")))
                   (cond
                     (   (= 7 (getvar 'ERRNO)) (princ "\nMissed, try again."))
                     (   (eq 'ENAME (type en))
                           (if (not (eq "MLINE" (cdr (assoc 0 (entget en)))))
                               (princ "\nPlease Select an MLine.")
                           )
                     )
                   )
               )
         )
         (if (and en (setq pt (getpoint "\nSpecify Point for Field: ")))
               (vla-addtext
                   (   (if (= 1 (getvar 'CVPORT)) vla-get-paperspace vla-get-modelspace)
                     (setq dc (vla-get-activedocument (vlax-get-acad-object)))
                   )
                   (strcat "%<\\AcObjProp Object(%<\\_ObjId "
                     (if
                           (and
                               (vl-string-search "64" (getenv "PROCESSOR_ARCHITECTURE"))
                               (vlax-method-applicable-p (vla-get-utility dc) 'getobjectidstring)
                           )
                           (vla-getobjectidstring (vla-get-utility dc) (vlax-ename->vla-object en) :vlax-false)
                           (itoa (vla-get-objectid (vlax-ename->vla-object en)))
                     )
                     ">%).StyleName \\f \"%tc1\">%"
                   )
                   (vlax-3D-point (trans pt 1 0)) (getvar 'TEXTSIZE)
               )
         )
       )
   )
   (princ)
)
(vl-load-com) (princ)

mdbdesign 发表于 2022-7-6 04:44:06

哇,谢谢,太快了。
我如何知道使用任何:
(vl-string-search "64" (getenv "PROCESSOR_ARCHITECTURE"))
天啊。。。
再次感谢你

Lee Mac 发表于 2022-7-6 04:49:24

不客气
 
 
实际上,如果您确信例程将只在64位或32位上使用(而不是在两者之间使用),那么这一部分是不必要的;因为对于32位/64位平台,获取ObjectID的方法必然不同。
 
对于32位平台,您将使用:
 
然而,这在64位环境中不起作用。即使使用替代的vla-get-objectid32也不够,因为转换为字符串将对整数施加32位限制。
 
因此,我们使用:
 
(vla-getobjectidstring <Utility Object> <VLA-Object> <Hexadecimal?>)

mdbdesign 发表于 2022-7-6 04:56:03

最重要的是:它正在发挥作用。
谢谢李的启发。

Lee Mac 发表于 2022-7-6 04:58:27

作为我在这个帖子中发布的程序的扩展,我创建了一个“快速字段”程序。该程序将允许您为此类任务快速创建自定义字段命令。
 
我网站上的程序页面更详细地描述了该程序-请阅读,如果您在使用该程序时有任何问题,请告诉我
 

mdbdesign 发表于 2022-7-6 05:05:02

试图重用此代码将块名称字段插入dwg屏幕
程序要求选择block并再次选择block,但什么也没有发生。
我做错了什么?
 
(defun c:blf ( / dc en pt )
   (while
       (progn
         (while
               (progn (setvar 'ERRNO 0) (setq en (car (entsel "\nSelect block: ")))
                   (cond
                     (   (= 7 (getvar 'ERRNO)) (princ "\nMissed, try again."))
                     (   (eq 'ENAME (type en))
                           (if (not (eq "block" (cdr (assoc 0 (entget en)))))
                               (princ "\nPlease Select an block.")
                           )
                     )
                   )
               )
         )
         (if (and en (setq pt (getpoint "\nSpecify Point for Field: ")))
               (vla-addtext
                   (   (if (= 1 (getvar 'CVPORT)) vla-get-paperspace vla-get-modelspace)
                     (setq dc (vla-get-activedocument (vlax-get-acad-object)))
                   )
                   (strcat "%<\\AcObjProp Object(%<\\_ObjId "
                     (if
                           (and
                               (vl-string-search "64" (getenv "PROCESSOR_ARCHITECTURE"))
                               (vlax-method-applicable-p (vla-get-utility dc) 'getobjectidstring)
                           )
                           (vla-getobjectidstring (vla-get-utility dc) (vlax-ename->vla-object en) :vlax-false)
                           (itoa (vla-get-objectid (vlax-ename->vla-object en)))
                     )
                                       ">%)._EffectiveName \\f \"%tc4"
                   )
                   (vlax-3D-point (trans pt 1 0)) (getvar 'TEXTSIZE)
               )
         )
       )
   )
   (princ)
)
(vl-load-com) (princ)

mdbdesign 发表于 2022-7-6 05:07:17

好的,用“QuickField”解决了,但仍然想知道,上述代码(BLF)有什么问题

Lee Mac 发表于 2022-7-6 05:10:39

 
这:
(not (eq "block" (cdr (assoc 0 (entget en)))))
应该是:
(not (eq "INSERT" (cdr (assoc 0 (entget en)))))
 
这是:
">%)._EffectiveName \\f \"%tc4"
应该是:
">%).EffectiveName \\f \"%tc4\">%"

mdbdesign 发表于 2022-7-6 05:16:01

我按照指示进行了更改(我认为是这样):
(defun c:blf ( / dc en pt )
   (while
       (progn
         (while
               (progn (setvar 'ERRNO 0) (setq en (car (entsel "\nSelect block: ")))
                   (cond
                     (   (= 7 (getvar 'ERRNO)) (princ "\nMissed, try again."))
                     (   (eq 'ENAME (type en))
                           (if (not (eq "INSERT" (cdr (assoc 0 (entget en)))))
                               (princ "\nPlease Select an block.")
                           )
                     )
                   )
               )
         )
         (if (and en (setq pt (getpoint "\nSpecify Point for Field: ")))
               (vla-addtext
                   (   (if (= 1 (getvar 'CVPORT)) vla-get-paperspace vla-get-modelspace)
                     (setq dc (vla-get-activedocument (vlax-get-acad-object)))
                   )
                   (strcat "%<\\AcObjProp Object(%<\\_ObjId "
                     (if
                           (and
                               (vl-string-search "64" (getenv "PROCESSOR_ARCHITECTURE"))
                               (vlax-method-applicable-p (vla-get-utility dc) 'getobjectidstring)
                           )
                           (vla-getobjectidstring (vla-get-utility dc) (vlax-ename->vla-object en) :vlax-false)
                           (itoa (vla-get-objectid (vlax-ename->vla-object en)))
                     )
                        ">%).EffectiveName \\f \"%tc4\">%"
                   )
                   (vlax-3D-point (trans pt 1 0)) (getvar 'TEXTSIZE)
               )
         )
       )
   )
   (princ)
)
(vl-load-com) (princ)
 
并显示“参数太多”错误。我现在搞砸了什么?
页: [1] 2
查看完整版本: 标记多线样式的字段