标记多线样式的字段
创建许多多线样式以绘制车间细节的管道。现在我有点迷失了,哪一个是哪一个。
我认为field是我为所有使用的管道(多线样式)添加标签的解决方案。
手动可以,但我需要加快标记过程。
因为这是我第一次接触菲尔德,我又迷路了。
字段宏(?)如下所示(从字段对话框):
(%<\AcObjProp Object(%<\_ObjId 2128066088>%).StyleName \f "%tc1">%)其中红色部分是对象ID。
尝试编写脚本,但在打开字段的对话框时停止。
有没有自动化标签的想法?
例如:
按钮(命令)
选择对象
拾取插入点
...然后转到下一个。
非常感谢。 我认为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) 哇,谢谢,太快了。
我如何知道使用任何:
(vl-string-search "64" (getenv "PROCESSOR_ARCHITECTURE"))
天啊。。。
再次感谢你 不客气
实际上,如果您确信例程将只在64位或32位上使用(而不是在两者之间使用),那么这一部分是不必要的;因为对于32位/64位平台,获取ObjectID的方法必然不同。
对于32位平台,您将使用:
然而,这在64位环境中不起作用。即使使用替代的vla-get-objectid32也不够,因为转换为字符串将对整数施加32位限制。
因此,我们使用:
(vla-getobjectidstring <Utility Object> <VLA-Object> <Hexadecimal?>) 最重要的是:它正在发挥作用。
谢谢李的启发。 作为我在这个帖子中发布的程序的扩展,我创建了一个“快速字段”程序。该程序将允许您为此类任务快速创建自定义字段命令。
我网站上的程序页面更详细地描述了该程序-请阅读,如果您在使用该程序时有任何问题,请告诉我
李 试图重用此代码将块名称字段插入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) 好的,用“QuickField”解决了,但仍然想知道,上述代码(BLF)有什么问题
这:
(not (eq "block" (cdr (assoc 0 (entget en)))))
应该是:
(not (eq "INSERT" (cdr (assoc 0 (entget en)))))
这是:
">%)._EffectiveName \\f \"%tc4"
应该是:
">%).EffectiveName \\f \"%tc4\">%" 我按照指示进行了更改(我认为是这样):
(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