明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2150|回复: 16

[提问] 手工画直线的方法如何写成代码

[复制链接]
发表于 2023-9-30 12:28:38 | 显示全部楼层 |阅读模式
手工画直线的方法如何写成代码,

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

请教以下两种画法

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

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

谢谢



"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2023-10-12 13:50:41 | 显示全部楼层
在论坛上找的类似命令



  1. ;;;动态角度矩形
  2. (defun c:are (/ os pt1 pt2 pt3 pt4 ag0 ag len ent ct in k)
  3.   (setq os (getvar "osmode"))
  4.   (while (and (setq pt1 (getpoint "\n角点1:"))
  5.               (setq ag0  (getangle pt1 "角度:"))
  6.        (progn (princ "对角点:") (setq ct t))
  7.        (progn
  8.   (setq ct t k t ent nil)
  9.          (while ct
  10.     (setq in (grread 1))
  11.     (cond
  12.        (  (= 5 (car in))
  13.                         (setq pt3 (cadr in))
  14.                         (setq len (distance pt1 pt3) ag  (angle pt1 pt3) )
  15.                         (setq pt2 (polar pt1 ag0 (* len (cos (- ag ag0)))))
  16.                         (setq pt4 (polar pt1 (+ (/ pi 2.) ag0) (* len (sin (- ag ag0)))))
  17.           (if ent (command "erase" ent ""))
  18.           (setvar "osmode" 0)
  19.           (command "pline" pt1 pt2 pt3 pt4 "c" )
  20.           (setvar "osmode" os)
  21.           (setq ent (entlast))
  22.                      )
  23.        (  (= 3 (car in))
  24.           (setq pt3 (cadr in))
  25.                         (setq len (distance pt1 pt3) ag  (angle pt1 pt3) )
  26.                         (setq pt2 (polar pt1 ag0 (* len (cos (- ag ag0)))))
  27.                         (setq pt4 (polar pt1 (+ (/ pi 2.) ag0) (* len (sin (- ag ag0)))))
  28.           (if ent (command "erase" ent ""))
  29.           (setvar "osmode" 0)
  30.           (command "pline" pt1 pt2 pt3 pt4 "c" )
  31.           (setvar "osmode" os)
  32.           (setq ent (entlast))
  33.           (setq ct nil)
  34.        )
  35.        (  (equal '(11 0) in)
  36.           (if ent (command "erase" ent ""))
  37.           (setq ct nil k nil)
  38.        )
  39.        (t)
  40.     )  
  41.          )
  42.          k
  43.        )
  44.     )
  45.       
  46.   )
  47.   (setvar "osmode" os)
  48.   (princ)
  49. )

发表于 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的通用命令格式,更具有通用性。



发表于 2023-10-1 10:48:44 | 显示全部楼层
本帖最后由 xyp1964 于 2023-10-1 10:49 编辑

  1. (defun c:tt ()
  2.   (defun abc (a b l / sc)"沿空间两点的距离点"
  3.     (setq sc (/ l (distance a b) 1.))
  4.     (mapcar '(lambda (x y) (+ x (* (- y x) sc))) a b)
  5.   )
  6.   (setq i -1)
  7.   (setq kw (Ukword 1 "1 2" "[A点+B点(1)/A点+角度(2)]" kw))
  8.   (setq dd (Udist 7 "" "线长<输入或鼠标直接量取>" dd nil))
  9.   (setq A (getpoint "\n基点A<退出>: "))
  10.   (cond ((and (= kw "1") (setq B (getpoint A "\n方向点B<退出>: ")))
  11.          (setq a1 (abc a b dd))
  12.          (command "line" "non" a "non" a1 "")
  13.         )
  14.         ((and (= kw "2")(setq ang (Uangle 1 "" "角度<输入或鼠标直接量取>" ang nil)))
  15.          (setq a1 (polar a ang dd))
  16.          (command "line" "non" a "non" a1 "")
  17.         )
  18.   )
  19.   (princ)
  20. )
发表于 2023-9-30 22:02:03 | 显示全部楼层
@100<45
距离100,角度45°
是这个意思吗?
 楼主| 发表于 2023-9-30 23:25:00 | 显示全部楼层

这角度和距离可任意设置的
当然不是在程序中设置
我想在画直线命令中设置
 楼主| 发表于 2023-10-1 12:36:24 | 显示全部楼层

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


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2023-10-2 20:50:06 | 显示全部楼层
guosheyang 发表于 2023-10-2 18:05
是这样模拟line命令吗  用get函数写一个就是 get函数本身有这个功能

具体是那个函数请来个示范
谢谢
发表于 2023-10-2 21:27:01 | 显示全部楼层
getdist  getpoint等函数都有此功能
 楼主| 发表于 2023-10-2 21:34:06 | 显示全部楼层
guosheyang 发表于 2023-10-2 21:27
getdist  getpoint等函数都有此功能

我看你的示范
和手工画图一样的
这不用什么程序都可以办到的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-17 06:35 , Processed in 0.182715 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表