guyzen2004 发表于 2022-7-6 17:16:34

用于标注尺寸的Lisp

你能给我一个lisp,当你做一条线,一个弧或一个圆,尺寸已经纳入其中。尺寸线应位于该线上方或下方7mm处。谢谢

wizman 发表于 2022-7-6 17:21:31

以下是一个用于线路:
 
(defun c:DLine (/ line_pt1 line_pt2)
(if (and (setq line_pt1 (getpoint ">>>...Pick First Point...>>>:"))
   (setq line_pt2 (getpoint line_pt1 ">>>...Pick next point...>>>: "))
   )
   (progn
   (vl-cmdf "._line" line_pt1 line_pt2 "")
   (while line_pt2
(command "._dimaligned"
       line_pt1
       line_pt2
       (polar        line_pt2
                (+ (angle line_pt1 line_pt2) (/ pi 2))
                7               
       )
)
(setq line_pt1 line_pt2
      line_pt2 '()
)
(if (and line_pt1
       (setq line_pt2 (getpoint line_pt1 ">>>...Pick next point...>>>: "))
    )
(vl-cmdf "._line" line_pt1 line_pt2 "")
)
   )
   )
)
(princ)
)
(princ)

guyzen2004 发表于 2022-7-6 17:24:58

嗨,威兹曼,
谢谢你的lisp文件。我要找的是Lisp程序。但我很抱歉,我没有给你一个详细的解释Lisp程序,适合我的需要。实际上,我需要一个lisp,可以标注一种钢筋弯曲长度。我把它画成不同的比例(1/30,1/20),但大多是1/50的比例。尺寸线的7 mm距离是按给定比例打印时与钢筋的实际距离。因此,对于1/50比例,距离应为350 mm,1/30为210 mm,1/20为140 mm。我希望你能抽出时间再给我发一封Lisp程序的信。非常感谢。
 
P、 你能把尺寸层和钢筋分开吗。
绘画图纸

wizman 发表于 2022-7-6 17:28:41

这适用于直线,我看看以后是否可以为圆弧腾出时间。
(defun c:DLine(/line\u pt1 line\u pt2 DLine\u scale DLine\u curlay DLine\u scale\u dist*error*)(defun*error*(msg)(setvar'clayer DLine\u curlay)(setvar'cmdecho 1));\uend\u defun(Setvar“cmdecho 0)(setq dline\u curlay(getvar“clayer”))(命令“Layer”“on”“DIMS”“unlock”“DIMS”“thaw”“DIMS”“m”“DIMS”“c”“6”“DIMS”“);\uend_命令;_end_命令;;Cab的用户输入功能(while(progn(setq dline\u scale(cond((getint“\n输入绘图比例:”)))));\uend_cond);_end\u setq(if(not(vl position dline\u scale)(20 30 50))(not(提示“\n仅从20 30和50中选择,请重新输入”);\uend_not);_end_if);_end_progn);_结束时(cond((=dline\u scale 20)(setq dline\u scale\u dist 140))((=dline\u scale 30)(setq dline\u scale\u dist 210))((=dline\u scale 50)(setq dline\u scale\u dist 350));\uend\u cond(if(and(setq line\u pt1(getpoint“\n>>>…拾取第一个点…>>>:”);\uend_getpoint);_end\u setq(setq line\u pt2(getpoint line\u pt1“\n>>>…拾取下一个点…>>>:”);\uend_getpoint);_end_setq);_end_和(progn(setvar‘clayer’dline\u curlay)(vl cmdf)“_line”line“line\u pt1 line\u pt2”“)(而line\u pt2(setvar‘clayer”DIMS”)(命令“_dimlined”“non”line\u pt2“non”(极线pt2(+(角度线pt1 line\u pt2)(/pi 2))dline\u scale\u dist);_end_polar);_end_命令(setvar“clayer dline\u curlay)(setq line\u pt1 line\u pt2 line\u pt2’());_end\u setq(if(和line\u pt1(setq line\u pt2(getpoint line\u pt1“\n>>>…拾取下一个点…>>>:”);\uend_getpoint);_end_setq);_end_和(vl cmdf)._line“line\u pt1 line\u pt2”);_end_if);_end_while);_end_progn);_如果(*error*“”)(princ));_end\u defun(提示“\n>>>…dline.lsp现在已加载。键入dline以运行。。。

guyzen2004 发表于 2022-7-6 17:33:36

谢谢Wizman,它工作得很好。lisp是否可能在拾取多段线(请参见附件)时执行相同的标注模式?
绘画图纸

wizman 发表于 2022-7-6 17:37:17

更新编号3
 
;|******************************************************************为多段线(具有多段)尺寸标注创建的程序日期:2008年10月19日创建人:WIZMAN**************;(定义c:mdim(/ent\u layer mdim\u curdimscal mdim\u curlay mdim\u curluprec mdim\u curosmode mdim\u enttemp mdim\u enttemp2 mdim\u pline\u ent mdim\u pline\u ent vla mdim\u pline\u pts mdim\u pt1 mdim\u x mdim\u x1 mdim\u y mdim\u y1 x*错误*第二个点DERIV\u在ENTU点ENTU CLOSED ENTU ENTGET ent\u layer ent\u TEMP\u OPEN LINE U pt1 LINE\U pt2 mdim\U时钟测试MDIM\u计数器MDIM\u CURDIMSCAL MDIM\u CURLAY MDIM\u CURLUPREC MDIM\u CUROSMODE MDIM\u DAN MDIM\u ENTTEMP MDIM\u ENTTEMP2 MDIM\u PLINE\u ENT\u VLA MDIM\u PLINE\u PTS MDIM\u PT1 MDIM\u PT2 MDIM\u SCALE MDIM\u SCALE MDIM\u DIST MDIM\u X MDIM\u X1 MDIM\u Y MDIM\u Y1中点u AT_CURVE PARAM\u AT_POINT RON1 RON2 X)(vl load com)(定义*错误*(消息)(setvar'clayer mdim\u curlay)(setvar'dimscale mdim\u curdimscal)(setvar'luprec mdim\u curluprec)(命令“.\u undo”“\u end”)(setvar'cmdecho 1)(setvar'osmode mdim\u curosmode));\uend\u defun(defun mdim\u revpoly(selected\u pline)(setq mdim\u pt1(vlax curve getendpoint(vlax ename->vla object selected\u pline));\uend_vlax-curve-getendpoint);_end\u setq(setq mdim\u y(cadr mdim\u pt1))(setq mdim\u x(car mdim\u pt1))(setq mdim\u x1(+mdim\u x 100))(setq mdim\u y1(+mdim\u y 100))(setq mdim\u pt2(list mdim\u x mdim\u y1))(setvar'clayer ent\u layer)(命令“line”“NON”mdim\u pt2“NON”mdim\u pt1”“)(setq mdim\u enttemp(entlast))(命令“pedit”mdim\u enttemp“y”“j”selected\u pline“”)(setq mdim\u enttemp2(entlast))(命令“break”mdim\u enttemp2“NON”mdim\u pt1“NON”mdim\u pt1);_命令结束;_命令结束;_命令结束(entupd mdim\u enttemp2)(命令“erase”mdim\u enttemp2”“)(setq mdim\u pline\u ent(entlast))(setq mdim\u pline\u pts(mapcar’(lambda(x)(trans x 0 1))(mapcar’cdr(vl remove if not’(lambda(x)(=10(car x)))(entget mdim\u pline\u ent);\uend_entget);_end_vl-remove-if-not);_end_mapcar);_end_mapcar);_end_setq(defun顺时针-p(p1 p2 p3)(<(sin(-(角度p1 p3)(角度p1 p2)))-1e-14));_end\u defun(setq mdim\u pline\u ent\u vla(vlax ename->vla object mdim\u pline\u ent);(命令“_regen”);_end_setq);_end\u defun(setvar'cmdecho 0)(命令“.u undo”“\u end”)(命令“.u undo”“\u begin”)(setq mdim\u curlay(getvar'clayer))(setq mdim\u curdimscal(getvar'dimscale))(setq mdim\u curluprec(getvar'luprec))(setq mdim\u curosmode(getvar'osmode))(命令“Layer”“m”“DIMS”“unlock”“DIMS”“解冻”“DIMS”“on”“DIMS”“c”“6”“DIMS”“);\uend_命令;_end_命令;_end_命令;_end_命令;;Cab的用户输入功能(while(progn(setq mdim_scale(cond((getint“\n输入绘图比例:”)))));_end_cond);_end\u setq(if(not(vl位置mdim\u比例)(20 30 50))(not(提示“\n仅从20 30和50中选择,请重新输入”);\uend_not);_end_if);_end_progn);_结束时(cond((=mdim\u scale 20)(setq mdim\u scale\u dist 140))((=mdim\u scale 30)(setq mdim\u scale\u dist 210))((=mdim\u scale 50)(setq mdim\u scale\u dist 350));\uend\u cond(setvar'dimscale mdim\u scale)(while(not(setqmdim\u pline\u ent(ssget:E:S“((0。“LWPOLYLINE”))));_end_setq);_end\u not(princ“\n missed….PICK AGAIN”);\u结束时;;;(命令“_break”(ssname mdim\u pline\u ent 0)(vlax curve getendpoint(vlax ename->vla object(ssname mdim\u pline\u ent 0));;;(vlax curve getendpoint(vlax ename->vla object(ssname mdim\u pline\u ent 0()))(setq ent\u layer(cdr(assoc 8(entget(ssname mdim\u pline\u ent 0())))(setq mdim\u pline\u pts(mapcar’(lambda(x)(trans x 0 1))(mapcar‘cdr(vl remove if not’(lambda(x)(=10(car x)))(entget(ssname mdim\u pline\u ent 0));_end_entget);_end_vl-remove-if-not);_end_mapcar);_end_mapcar);_end_setq(if(and(=(setq ent_closed(cdr(assoc 70(entget(ssname mdim\u pline\u ent 0())))))1)(非(setq mdim\u时钟测试(顺时针-p(car mdim\u pline\u pts)(cadr mdim\u pline\u pts)(caddr mdim\u pline\u pts));\uend_顺时针-p);_end_Setq);_end_not);_end_和(progn(setq ent_entget(entget(ssname mdim\u pline\u ent 0))(entmod(subst(cons 70 0)(assoc 70 ent\u entget)ent\u entget))(setq ent\u temp\u open t));\uend_progn);_end\u if(if(非mdim\u clocktest;\uend\u Setq);\uend\u not(mdim\u revpoly(ssname mdim\u pline\u ent 0))(setq mdim\u pline\u ent\u vla(vlax ename->vla object(ssname mdim\u pline\u ent 0));\uend\u setq;\uend_setq);_end_if(setvar'osmode 0)(setq mdim\u计数器0)(while(<mdim\u计数器(fix(vlax curve getendparam mdim\u pline\u ent\u vla));_end_fix);_end_<(setq line_pt1(vlax curve getpointatparam mdim\u pline\u ent\u vla mdim\u counter));_end\u setq(setq line\u pt2(vlax curve getpointatparam mdim\u pline\u ent\u vla(1+mdim\u计数器));\uend_vlax-curve-getpointatparam);_end\u setq(命令“.u layer”“s”“DIMS”“”)(if(=(vla getbulge mdim\u pline\u ent\u vla mdim\u counter)0.0)(progn(princ“\nstraight”)(命令“.u dimlined”“non”line\u pt1“non”line\u pt2“non”(极线pt2(+(角度线pt1 line\u pt2)(/pi 2))mdim\u scale\u dist);\uend_polar);_end_命令);_end\u progn(progn(princ“\ncurve”)(setq middpoint\u at\u curve(vlax curve getpointatdist mdim\u pline\u ent\u vla(+(*((vlax curve getdistatparam mdim\u pline\u ent\u vla(1+mdim\u counter));\uvlax曲线末端getdistatparam(vlax曲线getdistatparam mdim_pline_ent_vla mdim_counter)vlax曲线终点getdistatparam);_结束-0.5);_*(vlax curve getdistatparam mdim\u pline\u ent\u vla mdim\u counter)的末尾;_结束+;\uvlax曲线终点getpointatdist);_setq结束(setq param_at_point(vlax curve getparamatpoint mdim_pline\u ent\u vla Middpoint_at_curve);_vlax曲线终点(getparamatpoint);_setq结束(setq deriv_at_点(vlax曲线getfirstderiv mdim_pline_ent_vla param_at_点);_vlax曲线结束(getfirstderiv);_setq结束(setq第二个_点(mapcar’+midpoint_at_curve deriv_at_point))(命令“_dimangular”“”(osnap(vlax curve getpointatparam mdim_pline\u ent\u vla param_at_point;(1+mdim_计数器));_end_vlax-curve-getpointatparam“_cen”);_end_osnap line_pt1 line_pt2“非”(极性中点位于曲线(+(角度中点位于曲线第二个点)(/pi 2))mdim_scale\u dist);_end_polar);_end_命令(setq mdim_dan(vlax ename->vla object(entlast));(setvar’luprec 0)(vla put TextOverride mdim\u dan(rtos(-(Setq ron1)(vlax curve get

wizman 发表于 2022-7-6 17:41:20

updated code above.........:-)
 


-wiz

wizman 发表于 2022-7-6 17:47:37

here's the latest version...'-)
 
-wiz
mdim.lsp

guyzen2004 发表于 2022-7-6 17:50:37

Hi,
I downloaded the mdim.lspfile but I can't make it work.When you pick on the polyline, an option for editing a polyline will just pop out. I tried it on both model space and paper space but just the same. I'm using Autocad 2007 and I don't know if it has an effect on that. As I see on your attached drawing it's a powerfull tool with regards to my line of work because it reduces my time putting dimensions on all the rebar outlines that I'm making of. I hope you still find time to go through this file.Thanks you.

wizman 发表于 2022-7-6 17:54:55

i'll try take a look at it later today... try making a new an open pline with minimum of 3 segments first, then run mdim on that pline. let me know whats the result.
页: [1] 2
查看完整版本: 用于标注尺寸的Lisp