ynhh 发表于 2023-9-30 12:28:38

手工画直线的方法如何写成代码

手工画直线的方法如何写成代码,

曾见过一次 带角度画指定距离的直线 的方法
但想不起来了
帮助中也没写这么详细

请教以下两种画法

一、起点 A 以 B 点为方向控制点, 画指定距离L 的直线

二、起点 A 带角度 J画指定距离L 的直线,直接用输入角度 <J 的方法

谢谢


alexmai 发表于 2023-10-12 13:50:41

在论坛上找的类似命令



;;;动态角度矩形
(defun c:are (/ os pt1 pt2 pt3 pt4 ag0 ag len ent ct in k)
(setq os (getvar "osmode"))
(while (and (setq pt1 (getpoint "\n角点1:"))
            (setq ag0(getangle pt1 "角度:"))
       (progn (princ "对角点:") (setq ct t))
       (progn
(setq ct t k t ent nil)
         (while ct
    (setq in (grread 1))
    (cond
       ((= 5 (car in))
                        (setq pt3 (cadr in))
                        (setq len (distance pt1 pt3) ag(angle pt1 pt3) )
                        (setq pt2 (polar pt1 ag0 (* len (cos (- ag ag0)))))
                        (setq pt4 (polar pt1 (+ (/ pi 2.) ag0) (* len (sin (- ag ag0)))))
          (if ent (command "erase" ent ""))
          (setvar "osmode" 0)
          (command "pline" pt1 pt2 pt3 pt4 "c" )
          (setvar "osmode" os)
          (setq ent (entlast))
                     )
       ((= 3 (car in))
          (setq pt3 (cadr in))
                        (setq len (distance pt1 pt3) ag(angle pt1 pt3) )
                        (setq pt2 (polar pt1 ag0 (* len (cos (- ag ag0)))))
                        (setq pt4 (polar pt1 (+ (/ pi 2.) ag0) (* len (sin (- ag ag0)))))
          (if ent (command "erase" ent ""))
          (setvar "osmode" 0)
          (command "pline" pt1 pt2 pt3 pt4 "c" )
          (setvar "osmode" os)
          (setq ent (entlast))
          (setq ct nil)
       )
       ((equal '(11 0) in)
          (if ent (command "erase" ent ""))
          (setq ct nil k nil)
       )
       (t)
    )
         )
         k
       )
    )
      
)
(setvar "osmode" os)
(princ)
)

lostbalance 发表于 2023-10-2 21:41:27

你指的是模拟AutoCAD的line命令画直线吗?那可以这样:
1. 在cad中输入:   (command "line")
2. 根据cad的提示完成画直线的操作,记录每一步输入的内容,然后用:   (command 内容)   的方式代替。其中点的话,就是一个2或者3维的列表,关键词是文本格式,数字是数字格式。

比如最简单的两点直线,大致如下:
1. (command "line")
2. (command '(0 0 0))   ; 此处的'(0 0 0)是个三维坐标,如果要改成手动取点的话,可以改成(getpoint),或者用P1等变量代替,但要在步骤1之前就用完成赋值
3. (command '(100 100 100)) ;;此处的'(100 100 100)同步骤2的相关说明,也可以输入<45的角度,来进行角度操作,那么步骤3和4之间会增加一个类似步骤3的取点操作
4. (command "") ;;此处用"",模拟空格,结束操作,或者输入新的点或者其他信息,继续操作

为了说明清楚,上面的command分体了,一般command会用一行代码完成 (command "line" '(0 0 0) '(100 100 100) "")

大部分的cad命令,都可以用上述方法来模拟步骤,只不过类似取选择集之类的操作,需要在参数后增加一个"",表示完成局部动作。另外,需要注意的是,部分命令,在不同的cad版本下,上述步骤顺序或者关键词会有变化,导致失效,可以考虑增加cad的版本判断,或者,还可以在命令名前加"._"的方式,比如"._line",听说这样子是使用了全版本cad的通用命令格式,更具有通用性。



xyp1964 发表于 2023-10-1 10:48:44

本帖最后由 xyp1964 于 2023-10-1 10:49 编辑


(defun c:tt ()
(defun abc (a b l / sc)"沿空间两点的距离点"
    (setq sc (/ l (distance a b) 1.))
    (mapcar '(lambda (x y) (+ x (* (- y x) sc))) a b)
)
(setq i -1)
(setq kw (Ukword 1 "1 2" "" kw))
(setq dd (Udist 7 "" "线长<输入或鼠标直接量取>" dd nil))
(setq A (getpoint "\n基点A<退出>: "))
(cond ((and (= kw "1") (setq B (getpoint A "\n方向点B<退出>: ")))
         (setq a1 (abc a b dd))
         (command "line" "non" a "non" a1 "")
      )
      ((and (= kw "2")(setq ang (Uangle 1 "" "角度<输入或鼠标直接量取>" ang nil)))
         (setq a1 (polar a ang dd))
         (command "line" "non" a "non" a1 "")
      )
)
(princ)
)

hhh454 发表于 2023-9-30 22:02:03

@100<45
距离100,角度45°
是这个意思吗?

ynhh 发表于 2023-9-30 23:25:00

hhh454 发表于 2023-9-30 22:02
@100

这角度和距离可任意设置的
当然不是在程序中设置
我想在画直线命令中设置

ynhh 发表于 2023-10-1 12:36:24

xyp1964 发表于 2023-10-1 10:48


谢谢院长
您这个太高大上了
我觉得只是普通的画线操作,找到一个是从 0 0 开始画的,可指定距离和角度
但不能指定起点,我再研究学习一下
谢谢您
(command "_line")
(command "0,0")
(command "500.0<66.0")
(command "")

guosheyang 发表于 2023-10-2 18:05:05

是这样模拟line命令吗用get函数写一个就是 get函数本身有这个功能

ynhh 发表于 2023-10-2 20:50:06

guosheyang 发表于 2023-10-2 18:05
是这样模拟line命令吗用get函数写一个就是 get函数本身有这个功能

具体是那个函数请来个示范
谢谢

guosheyang 发表于 2023-10-2 21:27:01

getdistgetpoint等函数都有此功能

ynhh 发表于 2023-10-2 21:34:06

guosheyang 发表于 2023-10-2 21:27
getdistgetpoint等函数都有此功能

我看你的示范
和手工画图一样的
这不用什么程序都可以办到的
页: [1] 2
查看完整版本: 手工画直线的方法如何写成代码