直线,长度可以按某长度倍数输入
本帖最后由 hubeiwdlue 于 2023-9-24 13:35 编辑日常绘图的时候,时常有一个困扰,就是一个图纸上,有几个不同比例尺的图,有的绘图比例是1:1000,有的是1:500等,这个时候,总要按计算器来确定绘制直线的长度。本来想在论坛上找一个代替line的命令,可以直接在输入长度时候输入算式,或者有几倍长度的选项,但是没有找到。自己刚开始学,也没能力做出来。就写了一个弱化版的line,凑合用,可以在上下左右四个方向生成直线,长度有两个输入项,长度和倍数。输入第二个点时候,如果直接按空格,则进入倍数模式。
我不清楚这个功能的插件是难还是简单,如果有大神做出来,那就不胜感激了。
;;生成直线
(defun entmakeline (p1 p2)
(entmakex (list '(0 . "line") (cons 10 p1) (cons 11 p2)))
)
;;8等分象限函数
;;p0 定点p1 位置落在不同象限,返回 11 12 21 22 31 32 41 41,靠近x轴后缀是1,y轴后缀是2
(defun sl-8p (p0 p1 / ang xx) ;;象限
(setq ang (angle p0 p1))
(cond
((and (<= ang (* 0.25 pi)) (> ang 0)) (setq xx 11))
((and (<= ang (* 0.5 pi)) (> ang (* 0.25 pi))) (setq xx 12))
((and (<= ang (* 0.75 pi)) (> ang (* 0.5 pi))) (setq xx 22))
((and (<= ang (* 1 pi)) (> ang (* 0.75 pi))) (setq xx 21))
((and (<= ang (* 1.25 pi)) (> ang (* 1 pi))) (setq xx 31))
((and (<= ang (* 1.5 pi)) (> ang (* 1.25 pi))) (setq xx 32))
((and (<= ang (* 1.75 pi)) (> ang (* 1.5 pi))) (setq xx 42))
((and (<= ang (* 2 pi)) (> ang (* 1.75 pi))) (setq xx 41))
)
xx
)
;;主函数
(defun c:ll(/ p1 p2 p3 p4 bb dis n1 xx)
(setq p1 (getpoint "\n第一个点"))
(setq p2 (getpoint p1 "\n第二个点"))
(if (/= p2 nil)
(entmakeline (trans p1 1 0) (trans p2 1 0))
(progn
(setq bb (grread t 8 0) p3 (cadr bb))
(setq dis (getdist p1 "\n输入距离"))
(setq n1 (getreal "\n输入倍数"))
(setq xx (sl-8p p1 p3))
(cond
((or (= xx 11) (= xx 41)) (setq ang 0))
((or (= xx 12) (= xx 22)) (setq ang (* 0.5 pi)))
((or (= xx 21) (= xx 31)) (setq ang pi))
((or (= xx 32) (= xx 42)) (setq ang (* 1.5 pi)))
)
(setq p4 (polar p1 ang (* dis n1)))
(entmakeline (trans p1 1 0) (trans p4 1 0))
)
)
(princ)
)
本帖最后由 kucha007 于 2023-9-24 11:11 编辑
试试这个:
建议还是1:1制图,大不了编块放大或者用布局。要不然比例丢失绘制对不上会很麻烦
(defun c:TT (/ DOC Old_CMD TmpVar P1 P2 Flag StaPT EndPT)
(setq DOC (vla-get-ActiveDOCument (vlax-get-acad-object)))
(defun *error*(msg)
(setvar "cmdecho" Old_CMD)
(vla-endundomark DOC)
)
(vla-startundomark Doc) ;记录编组
(setq Old_CMD (getvar "cmdecho"))(setvar "cmdecho" 0) ;关闭回显
(if (not Global:SCSVar)(setq Global:SCSVar 1.0));设置首次为1
(while
(progn
(initget 2 "R S");非零
(setq TmpVar (getpoint (strcat "\n→请输入起点或:[参照(R)/比例(S)_" (rtos Global:SCSVar 2 2)"]")))
(cond
((and (eq (type TmpVar) 'STR)(eq (strcase TmpVar) "R"))
(if (setq P1 (getpoint "\n→请指定第一点:")
P2 (getpoint P1 "\n→请指定第二点:")
)
(setq Global:SCSVar (/ (getdist P1 "\n→请输入或量取新的长度:") (distance P1 P2)))
)
T ;继续循环
)
((and (eq (type TmpVar) 'STR)(eq (strcase TmpVar) "S"))
(initget (+ 2 4));非零非负
(setq Global:SCSVar
(cond
((getreal (strcat "\n→请输入缩放的值:<" (rtos Global:SCSVar 2 2) ">: ")))
(Global:SCSVar)
)
)
T ;继续循环
)
((and TmpVar (eq (type TmpVar) 'LIST))
(setq StaPT TmpVar
Flag T ;循环标志
)
(while Flag
(if (setq EndPT (getpoint StaPT "\n→请输入下一个点:"))
(progn
(setq EndPT (polar StaPT (angle StaPT EndPT) (* Global:SCSVar (distance StaPT EndPT))));放大后的点
(command "_Line" StaPT EndPT "")
(setq StaPT EndPT)
)
(progn
(setq Flag Nil);退出循环
(princ "\n——★★★ 未输入下一点, 程序退出!★★★——")
)
)
)
nil ;退出循环
)
(T
(princ "\n——★★★ 请输入起点或者关键词!★★★——")
nil ;退出循环
)
)
)
)
(setvar "cmdecho" Old_CMD)
(vla-endundomark Doc) ;结束编组
(princ)
)
本帖最后由 e2002 于 2023-9-24 18:49 编辑
可以在需要时,输入计算式:
1. 用 'cal 计算
2. 用AutoCAD自带的计算器
3. 用lisp语句,例如 (* 3400 150)
但无论如何,这种不按实际尺寸绘图,而是沿用手工绘图旧有习惯的方法,完全是自我找虐,是嫌自己还不够累,996还不够吧...
对于各种能高级的解决绘图与(出图)比例两者之间关系问题的功能,如 Annotative Scale, Layout, Viewport 你们这个单位是没一个人会用的,而且也不愿意学。
kucha007 发表于 2023-9-24 00:33
试试这个:
建议还是1:1制图,大不了编块放大或者用布局。要不然比例丢失绘制对不上会很麻烦
谢谢kucha007大神,仰望大神久矣,且屡受恩惠,能得到大神帮助,感激万分。因为周围同事,外院同行绘图比尺大都比较随意,在读图,修改,校核过程中,确有这个需求。再次谢谢大神的帮助。 做个沙发,不懂是啥! 绘图不是1:1画的么? bai2000 发表于 2023-9-23 20:49
绘图不是1:1画的么?
画配筋图的时候,平面图可能是1:100,剖面图是1:50或25,大样图可能是1:10。都在一张图里面,就需要用到不同的绘图比例,特别是修改的时候。 咏郡 发表于 2023-9-23 20:28
做个沙发,不懂是啥!
就是画直线的时候,当我输入1我希望它绘制出来是1*n,或者可以直接输入算式,或者是他类似可以1*n的方法。 本帖最后由 天命 于 2023-9-23 21:22 编辑
画图都是1:1的画,出图是按比例出图的,没用过布局吧 是不是有点复杂?先按1:1绘制,然后用放大命令按比例缩放不可以吗?这样线条,圆弧啥的都一把搞定多方便。
页:
[1]
2