woohhoo 发表于 2022-7-6 10:57:39

带半径和长度的弧尺寸

嗨,我有个大问题。我在网上找到了一个lisproutine,它可以测量圆弧的半径和长度。太棒了我做了一些调整,比如在测量之前放置文本,但这就是我对autolisp的了解
现在我需要帮助。我真的希望文本自动与圆弧对齐,并放置在尺寸线的上方和中间。
如图所示,文字尺寸、箭头和尺寸界线过大。
有没有可能在日常生活中调整这个问题?例如,一次,在你开始测量弧之前?
谢谢
 

(defun c:arcRL (/ cm fd ar1 ar2 ar3 ar4 ar5 tab oba )
(vl-load-com)
(setq cm (getvar "cmdecho"))
(setvar"cmdecho" 0)
(setq fd (getvar "fielddisplay"))
(if (/= fd 0)(setvar"fielddisplay" 0))
   (setq ar1 (entsel "\nSelect an Arc: "))
   (setq ar2 (car ar1))
   (setq tab (vlax-ename->vla-object ar2))
   (setq oba (vla-get-objectid tab))
   (setq ar3 (strcat "L=%<\\AcObjProp Object(%<\\_ObjId "
                     (rtos oba 2 0)
                     ">%).ArcLength \\f \"%ct8%pr0%lu2%ds44>%"))
    (setq ar4 (strcat "R=%<\\AcObjProp Object(%<\\_ObjId "
                     (rtos oba 2 0)
                     ">%).radius \\f \"%pr2%lu2%ds44>%"))
    (setq ar5 (strcat " "))

   (command "dimangular" ar1 "t" ar5pause)
   (command "mtext" pausepause ar4 ar3 )
(setvar"fielddisplay" fd)
(setvar "cmdecho" cm)
(princ)
)
 

fixo 发表于 2022-7-6 11:16:22

 
试试这个
 

(defun c:arcRL (/ acsp ar1 ar2 ar3 ar4 arclen cm cpt dim ep fd
   midp mtext mtxtpt oba rad rot sp tab txtpt)
(vl-load-com)

(setq acsp (vla-get-block
       (vla-get-activelayout
(vla-get-activedocument
    (vlax-get-acad-object)))))
(setq cm (getvar "cmdecho"))
(setvar"cmdecho" 0)
(setq fd (getvar "fielddisplay"))
(if (/= fd 0)(setvar"fielddisplay" 0))
   (setq ar1 (entsel "\nSelect an Arc: "))
   (setq ar2 (car ar1))
   (setq tab (vlax-ename->vla-object ar2))
   (setq sp (vlax-curve-getstartpoint tab)
ep (vlax-curve-getendpoint tab)
cpt (vlax-get tab 'Center)
rad (vlax-get tab 'Radius)
arclen (vlax-get tab 'ArcLength)
midp (mapcar (function (lambda (a b)(/ (+ a b) 2))) sp ep)
txtpt (trans (polar cpt (angle cpt midp)(+ rad (* 5 (getvar "DIMTXT"))))1 0)
mtxtpt (trans (polar txtpt (angle midp cpt) (* 2.5 (getvar "DIMTXT")))1 0)
rot (- (angle cpt midp)(/ pi 2))
)
   (setq oba (vla-get-objectid tab))
   (setq ar3 (strcat "L=%<\\AcObjProp Object(%<\\_ObjId "
                     (rtos oba 2 0)
                     ">%).ArcLength \\f \"%ct8%pr0%lu2%ds44>%"))
    (setq ar4 (strcat "\\PR=%<\\AcObjProp Object(%<\\_ObjId "
                     (rtos oba 2 0)
                     ">%).Radius \\f \"%pr2%lu2%ds44>%"))

   (setq dim (vlax-invoke acsp 'AddDimAngular cpt sp ep txtpt))
   (vla-put-textrotation dim rot)
   (setq mtext (vlax-invoke acsp 'AddMText mtxtpt 0.0 (strcat ar3 ar4)))   
   (vla-put-attachmentpoint mtext acAttachmentPointMiddleCenter)
   (vlax-invoke mtext 'Rotate cpt rot)
   (vlax-put mtext 'InsertionPointmtxtpt)
   (vla-put-height mtext (getvar "DIMTXT"))
(setvar"fielddisplay" fd)
(setvar "cmdecho" cm)
(princ)
)

 
~'J'~

woohhoo 发表于 2022-7-6 11:27:24

嗨,菲索,
 
谢谢你的努力。单击功能和对齐效果完美。还有几点需要改变。
是否可以删除尺寸线之间的度数,文字是否可以放置在尺寸线上方?
在图片上,左边的图片是现在的样子,右边的图片是我想要的样子,如果可能的话。
 
grz W公司
 

fixo 发表于 2022-7-6 11:29:49

试试这个

(defun c:arcRL (/ acsp arcent arclen arcobj cm cpt oldht dimht dimobj ep fd id
   lenstr midp mtext mtxtpt rad radstr rot sp sset txtpt)
(vl-load-com)

(setq acsp (vla-get-block
       (vla-get-activelayout
(vla-get-activedocument
    (vlax-get-acad-object))))
)
(setq cm (getvar "cmdecho"))
(setvar"cmdecho" 0)

(setq fd (getvar "fielddisplay"))
(if (/= fd 0)(setvar "fielddisplay" 0))

(if (= (setq oldht(getvar "dimtxt")) 0)
   (progn
   (initget 7)
   (setq dimht (getreal "\nEnter font height for multiline text: "))
   (setvar "dimtxt" dimht)
   )
   )
(prompt "\n>>Select arcs>>")
(if (setq sset (ssget (list (cons 0 "ARC"))))

   (while (setq arcent (ssname sset 0))

   (setq arcobj (vlax-ename->vla-object arcent))
   (setq sp (vlax-curve-getstartpoint arcobj)
ep (vlax-curve-getendpoint arcobj)
cpt (vlax-get arcobj 'Center)
rad (vlax-get arcobj 'Radius)
arclen (vlax-get arcobj 'ArcLength)
midp (vlax-curve-getclosestpointto arcobj
(vlax-curve-getpointatdist arcobj
    (/ arclen 2.))
)
txtpt (trans (polar cpt (angle cpt midp)(+ rad (* 5 (getvar "DIMTXT")))) 1 0)
)
   (setq id (vla-get-objectid arcobj))
   (setq lenstr (strcat "L=%<\\AcObjProp Object(%<\\_ObjId "
                     (rtos id 2 0)
                     ">%).ArcLength \\f \"%ct8%pr0%lu2%ds44>%"))
    (setq radstr (strcat "\\PR=%<\\AcObjProp Object(%<\\_ObjId "
                     (rtos id 2 0)
                     ">%).Radius \\f \"%pr2%lu2%ds44>%"))

   (setq dimobj (vlax-invoke acsp 'AddDimAngular cpt sp ep txtpt))
   (setq mtxtpt (trans (polar midp (angle cpt midp) (* 7 (getvar "DIMTXT"))) 1 0)
rot (- (angle cpt midp)(/ pi 2)))
   (setq mtext (vlax-invoke acsp 'AddMText mtxtpt 0.0 (strcat lenstr radstr)))   
   (vla-put-attachmentpoint mtext acAttachmentPointMiddleCenter)
   (vlax-invoke mtext 'Rotate cpt rot)
   (vlax-put mtext 'InsertionPointmtxtpt)
   (vla-put-height mtext (getvar "DIMTXT"))
   (vla-put-textoverride dimobj " ")
   (vla-update dimobj)
(ssdel arcent sset)
   )
)
(setvar"fielddisplay" fd)
(setvar "dimtxt" oldht)
(setvar "cmdecho" cm)
(prin1)
)

 
~'J'~

woohhoo 发表于 2022-7-6 11:42:14

干得好,Fixo!这几乎是我需要的。但我在使用它时注意到的事情仍然很少。我在代码中看到,可以输入文本的高度,但当我运行脚本时,它不起作用。第二件事是尺寸线和文本的方向。它总是在同一个方向上,在某些情况下,它可能对图形的布局不利。你能像下图右侧的例子那样解决这个问题吗?
谢谢!!
 

fixo 发表于 2022-7-6 11:49:39

 
对不起,我不能,这超出了我的编程水平
 
~'J'~

woohhoo 发表于 2022-7-6 12:07:11

 
好的,Fixo,没问题。谢谢你的好工作!
grz公司
页: [1]
查看完整版本: 带半径和长度的弧尺寸