需要帮助更新内的文本
当我生成一个新图形时,它会创建一个包含信息的文本文件。Autocad使用字符串位于图形中的特定图层自动更新该文件中的文字。根据字符串所在的层,这将决定更新时使用的信息。尽管如此,它不会更新块内的属性。有人能帮忙吗。我愿意讨论并协助解决这个问题。我将为我的标题栏自动化一些信息,我们所有的标题栏都被属性阻止。
以下是用于更新信息的代码
(defun uinfo () (princ "\nUpdating Drawing Information...")
(if (= found 1)
(progn (setq dummy (read-line infile))
(setq desc (read dummy))
(setq dummy (read-line infile))
(setq drawing (read dummy)))
(progn (setq desc '(1 . "- NEW EQUIPMENT -"))
(setq drawing '(1 . "- UNASSIGNED -"))))
(setq sset (ssget "X" (list (cons 0 "TEXT") (cons 8 "TITLE"))))
(setq lp 0)
(while (< lp (sslength sset))
(setq ent (entget (ssname sset lp))) (setq entinfo (cdr (assoc 1 ent)))
(if (= (substr entinfo 1 4) "Desc") (entmod (subst desc (assoc 1 ent) ent)))
(if (= (substr entinfo 1 4) "Draw") (entmod (subst drawing (assoc 1 ent) ent)))
(if (= (substr entinfo 1 3) "Dwg") (entmod (subst drawing (assoc 1 ent) ent)))
(if (= (substr entinfo 1 4) "DESC") (entmod (subst desc (assoc 1 ent) ent)))
(if (= (substr entinfo 1 4) "DRAW") (entmod (subst drawing (assoc 1 ent) ent)))
(if (= (substr entinfo 1 3) "DWG") (entmod (subst drawing (assoc 1 ent) ent)))
(setq lp (1+ lp)))
(setq sset nil) (setq lp nil)
(setq sset (ssget "X" (list (cons 0 "TEXT") (cons 8 (strcat tcircuit "-EQMRK")))))
(setq lp 0)
(if (/= sset nil)
(while (< lp (sslength sset))
(setq ent (entget (ssname sset lp)))
(setq entinfo (cdr (assoc 1 ent)))
(if (= (substr entinfo 1 4) "Desc") (entmod (subst desc (assoc 1 ent) ent)))
(if (= (substr entinfo 1 4) "Draw") (entmod (subst drawing (assoc 1 ent) ent)))
(if (= (substr entinfo 1 3) "Dwg") (entmod (subst drawing (assoc 1 ent) ent)))
(if (= (substr entinfo 1 4) "DESC") (entmod (subst desc (assoc 1 ent) ent)))
(if (= (substr entinfo 1 4) "DRAW") (entmod (subst drawing (assoc 1 ent) ent)))
(if (= (substr entinfo 1 3) "DWG") (entmod (subst drawing (assoc 1 ent) ent)))
(setq lp (1+ lp))))
(princ "Done.")
(prin1))
以下是用于根据其各自的图层更新图形中所有信息的实际例程。
(defun C:UPDATE ()
(setvar "CMDECHO" 0)
(setvar "MENUCTL" 0)
;; (command "._snap" "0.03125")
(command "plinewid" "0.0")
(if (null filename) (setq filename (getstring "\nPath and name of update file: ")))
(if (null tcircuit)
(progn (C:EQUIP2))
(progn (makenames tcircuit) (checklayers tcircuit)))
(if (null tcircuit)
(progn
(princ "\nCurrent name has not been established")
(princ "\nplease type EQUIP and establish current equip. or make new"))
(progn
(openfile)
(seek-tcircuit)
(if (= (getvar "userr1") 0.0) (setvar "userr1" 3.0))
(if (= (getvar "userr2") 0.0) (setvar "userr2" 1.0))
(if (ssget "X" (list (cons 8 "CIRCUIT-INFO") (cons 0 "TEXT"))) (uinfo) (repeat 2 (read-line infile)))
(if (ssget "X" (list (cons 8 "TITLE") (cons 0 "TEXT"))) (udates) (repeat 2 (read-line infile)))
;; (uinfo)
;; (udates)
(if (= found 1)
;; (progn (udp) (uext) (uldar) (uvalve))
(princ "\nNO INFORMATION TO UPDATE"))
(closefile)))
(command "._-layer" "s" PIPING "")
(princ))
我需要添加到代码中,以便它将更新块中定义的属性文本字符串。如果您有任何意见或任何问题,我将不胜感激。 下面是一个更改标题栏中值的示例,使用VL而不是ent。这意味着获取值或输入新值。使用属性标记名确定要更改的属性。
; changes to issued for construction
: thanks to lee mac for original code
(vl-load-com)
; 1.Get current date in mm/dd/yy format.
(defun ddmmyy (/ x today)
(setvar "cmdecho" 0)
(setq x (getvar "CDATE")) ; get current date
(setq today ( rtos x 2 4)) ; convert to a string
(setq date (strcat (substr today 7 2) "." (substr today 5 2) "." (substr today 3 2) ))
)
(setq oldtag1 "DRAWING_STATUS") ;attribute tag name
(setq newstr1 "ISSUED FOR CONSTRUCTION")
(setq oldtag2 "REV_NO");attribute tag name
(setq newstr2 "0")
(setq ss1 (ssget "x"'((0 . "INSERT") (2 . "DA1DRTXT"))))
(setq inc (sslength ss1))
(repeat inc
(foreach att (vlax-invoke (vlax-ename->vla-object (ssname SS1 (setq inc (1- inc)) )) 'getattributes)
(if (= oldtag1 (strcase (vla-get-tagstring att)))
(vla-put-textstring att newstr1)
) ; end if
(if (= oldtag2 (strcase (vla-get-tagstring att)))
(vla-put-textstring att newstr2)
) ; end if
) ; end for
) ;end repeat
(setq oldtag1 "REV-NO")
(setq newstr1 "0")
(ddmmyy)
(setq oldtag2 "DATE")
(setq newstr2 date)
(setq oldtag3 "AMENDMENT")
(setq newstr3 "ISSUED FOR CONSTRUCTION")
(setq ss2 (ssget "x"'((0 . "INSERT") (2 . "REVTABLE"))))
(setq inc (sslength ss2))
(repeat inc
(foreach att (vlax-invoke (vlax-ename->vla-object (ssname ss2 (setq inc (1- inc)))) 'getattributes)
(if (= oldtag1 (strcase (vla-get-tagstring att)))
(vla-put-textstring att newstr1)
)
(if (= oldtag2 (strcase (vla-get-tagstring att)))
(vla-put-textstring att newstr2)
)
(if (= oldtag3 (strcase (vla-get-tagstring att)))
(vla-put-textstring att newstr3)
)
)
)
(setq ss1 nil)
; (setq ss2 nil)
(princ)
有没有一段代码我可以添加到我现有的代码中,只告诉它在块和属性中搜索,而不仅仅是纯文本。谢谢 你可以使用很多
李·麦克的那个
;; Set Attribute Values-Lee Mac
;; Sets attributes with tags found in the association list to their associated values.
;; blk - Block (Insert) Entity Name
;; lst - Association list of ((<tag> . <value>) ... )
;; Returns: nil
(defun LM:setattributevalues ( blk lst / enx itm )
(while (= "ATTRIB" (cdr (assoc 0 (setq enx (entget (setq blk (entnext blk)))))))
(if
(and
(setq itm (assoc (cdr (assoc 2 enx)) lst))
(entmod (subst (cons 1 (cdr itm)) (assoc 1 enx) enx))
)
(entupd blk)
)
)
)
这是用于常规块。
ymg公司 也许值得一问的是,您对属性及其标记有多熟悉。也许每个图形文件都有几个标题栏块?你也需要根据图层更新吗? 谢谢你打电话给男生。
我非常熟悉属性和它们的标签,因为我们每天都在使用它们。我们有。dwg模板基于图形将具有多少张图纸(1SHT、2SHT、3SHT),但每个模板包含相同的标题栏,并具有定义的属性/标记。(即DRAWBY、SURVEYBY、DRAWDATE、SURVEYDATE、CLIENT、FACILITY)我当前的例程从中检索信息。dat文件,并将更新特定层上的常规文本,但它不会在具有属性的块中搜索。代码张贴在上面。 特梅拉康,
我跟不上你。
因为你发布的所有代码都没有找到一个区块,
它仅为文本。
现在,如果你有一个或多个标题栏,你可以使用
另一个例程用于获取块属性中的任何值。
该例程将是LM:GetAttributeValue。它可以在李的网站上找到。
如果要根据文件中的数据更新块属性
我在LM:setattributevalues上面发布的一个将设置所有属性
您将在列表中为给定块提供它们的新值。
你所需要做的就是做一个例行程序,把一个虚线列表放在一起
“((标记值)(…)”然后调用上面的:
(setqattriblst '("DRAWBY" "SURVEYBY" "DRAWDATE" "CLIENT" "FACILITY")
valuelst '("TM" "JB" "2014/05/16" "OUR BEST CLIENT" "WAREHOUSE #2")
updatelst (mapcar '(lambda (a b) (cons a b)) attriblst valuelst)
)
( LM:setattributevalues "TitleBlock Name" updatelst)
这是“使用属性和/或文本”吗?
页:
[1]