明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1365|回复: 13

[提问] LISP遇到无法理解的问题……新手求助

[复制链接]
发表于 2025-2-7 16:05:36 | 显示全部楼层 |阅读模式
我想写一个快速画“分割线”的LISP小程序,想着先把“分割线”的主体直线做出来,分割线的长度要比两个截断点外扩7倍的比例值,于是……就遇到了无法理解的问题……
如下图:红圈内是getpoint选择的两个点,比例输入的10,红线是程序生成的“分割线”,按照下图运行程序,左边红圈那里就不会沿X轴外扩70……,右边就完全没问题……


更让我无法理解的是(下图),截断点位置和上图是一摸一样的,只是把直线换成了垂直的…截断点外扩就没有任何问题(绿色线是程序生成的截断线)……


这是啥情况……代码里全是坐标和数值啊……跟是不是垂直直线有什么关系吗?希望高手给解惑一下,提前感谢啦!

代码内容如下:
(defun c:fgx (/ pt1 pt2 x1 y1 x2 y2 direction fgxscale mdpx mdpy startptx endptx startpty endpty #startpt #endpt)
  (setq pt1 (getpoint "\n选择第一点: "))
  (setq pt2 (getpoint "\n选择第二点: "))
  ;; 计算所选点的 X 和 Y 坐标
  (setq x1 (car pt1)
        y1 (cadr pt1)
        x2 (car pt2)
        y2 (cadr pt2))
  ;; 询问用户选择水平还是垂直
  (setq direction (getstring "\n选择方向 (H:水平, V:垂直): "))
  ;; 输入比例参数
  (setq fgxscale (getreal "\n输入比例参数: "))
  ;; 绘制分割线
  (cond
    ;; 水平分割线
    ((= (strcase direction) "H")
     ;;(setq mdpx (/ (+ x1 x2) 2))
     (setq mdpy (max y1 y2))
     (setq startptx (- (min x1 x2) (* 7 fgxscale)))
     (setq endptx (+ (max x1 x2) (* 7 fgxscale)))
     (setq #startpt (list startptx mdpy))
     (setq #endpt (list endptx mdpy))
     (command "._line" #startpt #endpt "")
                 (princ (strcat "\n Start X: " (rtos startptx) ", End X: " (rtos endptx) ",mdpy: " (rtos mdpy)))
    )
    ;; 垂直分割线
    ((= (strcase direction) "V")
     (setq mdpx (max x1 x2))
     (setq mdpy (/ (+ y1 y2) 2))
     (setq startpty (- (min y1 y2) (* 7 fgxscale)))
     (setq endpty (+ (max y1 y2) (* 7 fgxscale)))
     (command "LINE" (list mdpx startpty) (list mdpx endpty) "")
    )
    (t
     (princ "\n无效的方向选择,请重新运行命令。")
    )
  )
  (princ)
)
(princ "\n输入命令 fgx 以绘制分割线。")


本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2025-2-7 17:47:41 | 显示全部楼层
  1. (defun c:tt ()
  2.   (if (and (setq pt1 (getpoint "\n选择第一点: "))
  3.            (setq pt2 (getpoint pt1 "\n选择第二点: "))
  4.       )
  5.     (progn
  6.       (setq x1  (car pt1) ; 计算所选点的 X 和 Y 坐标
  7.             y1  (cadr pt1)
  8.             x2  (car pt2)
  9.             y2  (cadr pt2)
  10.             kw  (getstring "\n选择方向 (H:水平, V:垂直): ") ; 询问用户选择水平还是垂直
  11.             sc  (getreal "\n输入比例参数: ") ; 输入比例参数
  12.             sc1 (* 7 sc)
  13.       )
  14.       (cond ((= (strcase kw) "H") ; 水平分割线
  15.              (setq mdpy (max y1 y2)
  16.                    sp   (- (min x1 x2) sc1)
  17.                    ep   (+ (max x1 x2) sc1)
  18.                    p1   (list sp mdpy)
  19.                    p2   (list ep mdpy)
  20.              )
  21.              (command "line" "non" p1 "non" p2 "")
  22.             )
  23.             ((= (strcase kw) "V") ; 垂直分割线
  24.              (setq mdpx (max x1 x2)
  25.                    mdpy (/ (+ y1 y2) 2)
  26.                    sp   (- (min y1 y2) sc1)
  27.                    ep   (+ (max y1 y2) sc1)
  28.                    p1   (list mdpx sp)
  29.                    p2   (list mdpx ep)
  30.              )
  31.              (command "line" "non" p1 "non" p2 "")
  32.             )
  33.       )
  34.     )
  35.   )
  36.   (princ)
  37. )
回复 支持 1 反对 0

使用道具 举报

发表于 2025-2-7 18:08:47 | 显示全部楼层
选点顺序有影响,计算值应该加绝对值才行
回复 支持 1 反对 0

使用道具 举报

发表于 2025-2-7 16:23:28 | 显示全部楼层
建议画出一个原图和一个最终图,这样有个对比。
看了代码,不太明白你想实现什么?
回复 支持 反对

使用道具 举报

发表于 2025-2-7 16:33:25 | 显示全部楼层
(setvar "osnapcoord" 1)
开头加上这一行再试试看。
回复 支持 反对

使用道具 举报

发表于 2025-2-7 16:46:14 | 显示全部楼层
hhh454 发表于 2025-2-7 16:23
建议画出一个原图和一个最终图,这样有个对比。
看了代码,不太明白你想实现什么?

我也觉得楼主表述不清。
回复 支持 反对

使用道具 举报

发表于 2025-2-7 16:55:03 | 显示全部楼层
因为你用了command函数,所以有很大的可能是捕捉模式影响了你想要的结果,最好先关闭捕捉
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-7 16:56:16 | 显示全部楼层
hhh454 发表于 2025-2-7 16:23
建议画出一个原图和一个最终图,这样有个对比。
看了代码,不太明白你想实现什么?

感谢回复
我lisp新手一个,想做个简单的程序来学习一下
我是想实现这样一个功能,
1 在选定的两个点之间,画条水平或者垂直的线段;
2 线段的长度是选定的那两个点的X或Y轴坐标(根据水平或垂直选择)外扩一个指定的距离;
3 如果是水平线段,那么它的起点X坐标根据外扩距离进行计算得出,起点Y坐标是选定的那两个点较大的那个。
现在我碰到的问题是,帖子里那两张图片,在cad里,图1和图2里那两个对应的红圈点的坐标是完全一样的,怎么程序运行下来所生成的线段却不一样呢……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-8 09:37:49 | 显示全部楼层
wwwswallow 发表于 2025-2-7 16:33
(setvar "osnapcoord" 1)
开头加上这一行再试试看。

感谢回复,我试试看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-8 09:39:44 | 显示全部楼层


厉害!感谢感谢!另外,想请问一下,这个 "non" 在command里是干是干什么用的呀

点评

“non"临时取消捕捉  发表于 2025-2-8 10:05
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-4-5 08:56 , Processed in 0.192416 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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