hubeiwdlue 发表于 2023-9-23 19:17:39

直线,长度可以按某长度倍数输入

本帖最后由 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 00:33:32

本帖最后由 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:46:20

本帖最后由 e2002 于 2023-9-24 18:49 编辑

可以在需要时,输入计算式:
1. 用 'cal 计算
2. 用AutoCAD自带的计算器
3. 用lisp语句,例如 (* 3400 150)

但无论如何,这种不按实际尺寸绘图,而是沿用手工绘图旧有习惯的方法,完全是自我找虐,是嫌自己还不够累,996还不够吧...
对于各种能高级的解决绘图与(出图)比例两者之间关系问题的功能,如 Annotative Scale, Layout, Viewport 你们这个单位是没一个人会用的,而且也不愿意学。

hubeiwdlue 发表于 2023-9-24 07:59:39

kucha007 发表于 2023-9-24 00:33
试试这个:
建议还是1:1制图,大不了编块放大或者用布局。要不然比例丢失绘制对不上会很麻烦

谢谢kucha007大神,仰望大神久矣,且屡受恩惠,能得到大神帮助,感激万分。因为周围同事,外院同行绘图比尺大都比较随意,在读图,修改,校核过程中,确有这个需求。再次谢谢大神的帮助。

咏郡 发表于 2023-9-23 20:28:37

做个沙发,不懂是啥!

bai2000 发表于 2023-9-23 20:49:22

绘图不是1:1画的么?

hubeiwdlue 发表于 2023-9-23 20:54:43

bai2000 发表于 2023-9-23 20:49
绘图不是1:1画的么?

画配筋图的时候,平面图可能是1:100,剖面图是1:50或25,大样图可能是1:10。都在一张图里面,就需要用到不同的绘图比例,特别是修改的时候。

hubeiwdlue 发表于 2023-9-23 21:01:22

咏郡 发表于 2023-9-23 20:28
做个沙发,不懂是啥!

就是画直线的时候,当我输入1我希望它绘制出来是1*n,或者可以直接输入算式,或者是他类似可以1*n的方法。

天命 发表于 2023-9-23 21:20:48

本帖最后由 天命 于 2023-9-23 21:22 编辑

画图都是1:1的画,出图是按比例出图的,没用过布局吧

woxin168 发表于 2023-9-24 09:51:09

是不是有点复杂?先按1:1绘制,然后用放大命令按比例缩放不可以吗?这样线条,圆弧啥的都一把搞定多方便。
页: [1] 2
查看完整版本: 直线,长度可以按某长度倍数输入