找到了一个Lisp,它完成了我在这里寻找的叫做LengthText的东西,多亏了Lisp的创建者。
http://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/line-length-typing-lisp/td-p/2119240
使用它,但长度是在线条的起点提到的,形成一个杂乱使阅读困难。
关于如何修改lisp以使文本可以沿直线移动到中心,有什么指导吗?
- ;------------------------------------------------ LenghtOfObject ------------------------
- (defun LenghtOfObject (obj / len)
- (if (vl-catch-all-error-p (setq len (vl-catch-all-apply 'vlax-curve-getDistAtParam
- (list obj (vl-catch-all-apply 'vlax-curve-getEndParam (list obj)))))) nil len
- )
- )
- ;------------------------------------------------ c:LengthText ------------------------
- (defun c:LengthText ( / *ModelSpace* sel)
- (vl-load-com)
- (setq *ModelSpace* (vla-get-ModelSpace (vla-get-ActiveDocument(vlax-get-acad-object))))
- (setvar "errno" 0) ; when the user on ssget press Enter the errno is set to 52
- (while (and (setq sel (ssget))(/= (getvar "errno") 52))
- (if sel
- (progn
- (mapcar (function (lambda (ent / obj olg stpt TxtObj next_pt)
- (setq Obj (vlax-ename->vla-object ent))
- (if (setq olg (LenghtOfObject obj))
- (progn
- (setq stpt (vlax-curve-getStartPoint obj))
- (setq TxtObj (vla-addText *ModelSpace* (rtos olg 2 2) (vlax-3d-point stpt) (getvar"textsize"))) ;_ end of vla-addText
- (setq next_pt (if (= "AcDbArc" (vlax-get obj 'ObjectName))
- (vlax-curve-getendpoint obj); end point
- (vlax-curve-getPointAtParam obj (1+ (fix (vlax-curve-getParamAtPoint obj stpt))))
- ))
- (vla-put-Rotation TxtObj (angle stpt next_pt))
- (setq stpt (vla-get-InsertionPoint TxtObj))
- (vla-put-alignment TxtObj acAlignmentBottomLeft)
- (vla-put-TextAlignmentPoint TxtObj stpt)
- )
- (if (ssmemb ent sel)(ssdel ent sel))
- )
- ))(vl-remove-if-not '(lambda(x)(= (type x) 'ENAME)) (mapcar 'cadr (ssnamex sel))))
- )
- )
- )
- (princ)
- )
- ;------------------------------------------------ c:LenghtText1 ------------------------
- (defun c:LengthText1 ( / *ModelSpace* sel Obj )
- (vl-load-com)
- (setq *ModelSpace* (vla-get-ModelSpace (vla-get-ActiveDocument(vlax-get-acad-object))))
- (setvar "errno" 0) ; when the user on ssget press Enter the errno is set to 52
- (while (and (setq sel (ssget '((0 . "LINE,POLYLINE,LWPOLYLINE,ARC"))))(/= (getvar "errno") 52))
- (if sel
- (progn
- (mapcar (function (lambda (ent / obj oname stpt TxtObj next_pt)
- (setq Obj (vlax-ename->vla-object ent))
- (if (LenghtOfObject obj)
- (progn
- (setq oname (vlax-get obj 'ObjectName))
- (setq stpt (vlax-curve-getStartPoint obj))
- (setq TxtObj (vla-addText *ModelSpace* (strcat "%<\\AcObjProp Object(%<\\_ObjId "
- (vl-princ-to-string (vla-get-ObjectID obj))">%)."(if (= "AcDbArc" oname) "Arc" "")"Length \\f "%lu2%pr2%ps[, mm]">%")
- (vlax-3d-point stpt) (getvar"textsize"))
- ) ;_ end of vla-addText
- (setq next_pt (if (= "AcDbArc" oname)
- (vlax-curve-getendpoint obj); end point
- (vlax-curve-getPointAtParam obj (1+ (fix (vlax-curve-getParamAtPoint obj stpt))))
- ))
- (vla-put-Rotation TxtObj (angle stpt next_pt))
- (setq stpt (vla-get-InsertionPoint TxtObj))
- (vla-put-alignment TxtObj acAlignmentBottomLeft)
- (vla-put-TextAlignmentPoint TxtObj stpt)
- )
- (if (ssmemb ent sel)(ssdel ent sel))
- )
- ))(vl-remove-if-not '(lambda(x)(= (type x) 'ENAME)) (mapcar 'cadr (ssnamex sel))))
- )
- )
- )
- (princ)
- )
|