需要Autolisp紧急帮助
嗨,Lisp Legends,事实上,我是autolisp新手,刚刚复习了cadtutor。net,这里的会员做了很好的工作。首先感谢这些人:)
我需要你们朋友的紧急帮助。。。。实际上,我需要将文本(如附件所示)对齐到块的三个不同位置(红色)。是否有任何lisp使文本与这些位置对齐。
在附图中进一步解释
如有需要,请回复澄清。
等待您的回复。
谢谢
电磁轴承
样品图纸
请帮助朋友 试试这个
; pick 3 texts and align to a block
(vl-load-com)
(defun c:tritxt ( / oldang oldunit oldsnap obj ang ins Tp xscale bname ins)
(setq oldang (getvar 'angdir))
(setq oldunit (getvar 'aunits))
(setq oldsnap (getvar 'osmode))
(setvar 'angdir 0)
(setvar 'aunits 3)
(setvar 'osmode 0)
(setq obj (vlax-ename->vla-object (car (entsel "\nPick Block object"))))
(setq Objname (vla-get-Objectname obj))
(if (/= Objname "AcDbBlockReference") ; check is it a block
(alert "You have not Picked a block\n\nPress ok ")
(progn
(setq ang (vla-get-rotation obj))
(setq ins (vlax-safearray->list (vlax-variant-value(vla-get-insertionpoint obj))))
(setq xscale (vla-get-XScaleFactor obj))
(setq bname (vla-get-name obj))
(cond
((if (= bname "TERM_AER_E")(setq len 6))) ; as per sample
((if (= bname "xxxx")(setq len 10))) ; other blocks change len value
)
(setq off 2.0)
(setq Tp(vlax-ename->vla-object (car(entsel "\nPick text1"))))
(setq pt1 (vlax-3d-point(polar ins (+ ang (/ pi 2.0)) off)))
(vla-put-insertionpoint Tppt1)
(vla-put-rotation Tp ang )
(setq Tp(vlax-ename->vla-object (car(entsel "\nPick text2"))))
(setq pt1 (vlax-3d-point(polar ins (- ang (/ pi 2.0)) off)))
(vla-put-insertionpoint Tppt1)
(vla-put-rotation Tp ang )
(setq Tp(vlax-ename->vla-object (car(entsel "\nPick text3"))))
(setq pt1 (vlax-3d-point(polar ins ang (* len 2.0))))
(vla-put-insertionpoint Tppt1)
(vla-put-rotation Tp ang )
(setvar 'angdir oldang)
(setvar 'aunits oldunit)
(setvar 'osmode oldsnap)
)
)
)
嗨,比格尔,
非常感谢您的帮助:),但它显示了一些错误,您能检查一下下面提到的错误并还原吗
命令:TRITXT
拾取块对象;错误:没有函数定义:VLAX-ENAME->VLA-OBJECT
谢谢
电磁轴承 添加它
(vl-load-com) 您好,Devitg,
感谢您的回复,但代码(vl load com)已在Bigal提供的lisp中提供。
谢谢
电磁轴承 我复制并粘贴到我的autocad上,在您提供的样例dwg上测试,效果很好,所以不知道,您是否在另一个dwg上尝试过,或者您是如何复制代码的。 (defun c:demo (/ block Annotaions i data ang scale ipt iptoff objname npt layer)
(if (and
(princ "\nSelect reference block object")
(setq block (ssget "_+.:S:E" '((0 . "INSERT")(2 . "TERM_AER_E"))))
(not (redraw (setq block (ssname block 0)) 3))
(princ "\nSelect Annotations to align")
(setq Annotaions (ssget "_:L"
'((-4 . "<OR")
(-4 . "<AND") (0 . "INSERT")(2 . "SITE_ANNO")
(-4 . "AND>")
(-4 . "<AND")(0 . "MTEXT")(8 . "SITE_ANNO,COUNT_ANNO")
(-4 . "AND>")
(-4 . "OR>"))
))
(= (setq i (sslength Annotaions)) 3)
)
(progn
(redraw block 4)
(setq data (mapcar '(lambda (d)
(cdr (assoc d (entget block))))
'(10 41 50 41)))
(setq ang (caddr data)
ipt (car data)
scale (cadr data))
(setq iptoff (polar ipt ang (* scale 0.25))
ang (if (minusp (last data)) (+ ang pi)ang))
(repeat i
(setq item (vlax-ename->vla-object (ssname Annotaions (setq i (1- i))))
objname (vla-get-Objectname item)layer (vla-get-layer item))
(if (setq npt
(cond
( (eq objname "AcDbBlockReference")
(polar ipt ang
(distance ipt
(vlax-get item 'Insertionpoint)))
)
( (and (eq objname "AcDbMText")
(eq (strcase layer) "COUNT_ANNO"))
(polar iptoff (+ ang (* pi 1.5)) (* scale 1.5))
)
( (and (eq objname "AcDbMText")
(eq (strcase layer) "SITE_ANNO"))
(polar iptoff (+ ang (/ pi 2.0)) (* scale 1.5))
)
)
)
(progn (vlax-put item 'Insertionpoint npt)
(vlax-put item 'Rotation (+ ang (if (and (>= (* 1.5 pi) ang)
(> ang (* 0.5 pi))) pi 0))
))
)
)
)
)
)
(vl-load-com)
选择参照块对象
选择对象:
选择要对齐的注释
选择对象:找到3个
HTH公司
在我这边工作。
OP上的图片显示了3个文本对象,而样例图形显示了多行文字和一个块。与Bigals类似,我发布的代码考虑了多行文字和它工作的块。想知道注释是否因图纸而异。 你好,pBe,
感谢您观看这项工作,我用您提供的lisp进行了尝试,它将错误显示为“错误:无函数定义:VLAX-ENAME->VLA-OBJECT”
选择3个文本并按enter键后,显示该错误。请建议我在这个问题上做些什么。
等待您的回复。
嗨,比格尔,
再次感谢您关注这项工作。实际上,我只是复制了你提供的程序并将其保存在我的桌面上作为测试。lsp文件,然后加载&当输入TRITEXT命令时,在选择“TERM\u AER\u E”块后,显示以下错误。
命令:TRITXT
拾取块对象;错误:没有函数定义:VLAX-ENAME->VLA-OBJECT
谢谢
电磁轴承
页:
[1]
2