明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3441|回复: 58

[源码] 获取封闭矩形顶点坐标

[复制链接]
发表于 2023-6-14 16:59 | 显示全部楼层 |阅读模式
大佬们求助

          我想获取封闭矩形顶点坐标,比方说当我鼠标点击矩形内部区域时自动生成对角线,其实我要的是点击内部区域获取顶点坐标,请高人指教,不是点选矩形对角点。
发表于 2023-8-12 07:49 | 显示全部楼层
(defun c:tt ()
  "画矩形内部对角线"
  (while (setq p0 (getpoint "\n拾取矩形内部点<退出>: "))
    (bpoly p0)
    (setq s1 (entlast))
    (setq ptn (vl-remove-if '(lambda (x) (/= (car x) 10)) (entget s1))
          ptn (mapcar 'cdr ptn)
    )
    (entdel s1)
    (command "line" "non" (car ptn) "non" (caddr ptn) "")
    (command "line" "non" (cadr ptn) "non" (cadddr ptn) "")
  )
  (princ)
)
回复 支持 1 反对 0

使用道具 举报

发表于 2023-8-14 07:12 | 显示全部楼层
depgfdepgf 发表于 2023-8-14 06:44
大佬非常的完美,是否可以增加按鼠标右键退.这样方便很多

已更新 (簡體版) drpl2_chs.fas ,(繁體版) drpl2_cht.fas
請重新下載
回复 支持 1 反对 0

使用道具 举报

发表于 2023-8-13 19:47 | 显示全部楼层
本帖最后由 lee50310 于 2023-8-16 00:12 编辑

已更新

最新版 : (簡體版) drpl3_chs.fas ,(繁體版) drpl3_cht.fas  
1.修正鼠標越過垂直長條矩形框時 ,左右區域無法抓取問題   
2.修正虛線  線型比例為默認                                  日期:2023/8/15

執行指令:drpl
1.滑鼠移至目標區5個方位(上,下,中,左,右)  左擊鼠鍵==>繪製
2.離開程式==>右擊滑鼠鍵 或 滑鼠移至目標區外 左擊鼠鍵





本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
depgfdepgf + 1 大佬非常的完美,是否可以增加按鼠标右键退.

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2023-7-26 14:46 | 显示全部楼层
kzd2004 发表于 2023-7-26 14:04
你好,代码很好,我是小白,请问这个用什么命令能调出来?能把这个直接改成画对角线吗?谢谢你了。

命令就是TT
  1. (defun c:tt (/ gr lmts loop p1 p2 p3 p4 pt s1 s2 s3 s4 screen ys yx zs zx)
  2.   (defun screen(/ c03 c08 c04 c05 c07 c06 c09 c01 c02);
  3.     (setq  
  4.       c03 (trans (getvar "viewctr") 1 2)
  5.       c08 (getvar "viewsize")
  6.       c04 (getvar "screensize")
  7.       c09 (/ (* c08 (car c04)) (cadr c04))
  8.       c01 (list (- (car c03) (* 0.5 c09)) (- (cadr c03) (* 0.5 c08)))
  9.       c02 (list (+ (car c03) (* 0.5 c09)) (+ (cadr c03) (* 0.5 c08)))
  10.       c01 (trans c01 2 1)
  11.       c02 (trans c02 2 1)
  12.     )
  13.     (list c01 c02)
  14.   )
  15.   (setq loop t)
  16.   (while loop
  17.     (setq gr (grread t 15 0))
  18.     (cond
  19.       ((= 5 (car gr))
  20.         (setq lmts (screen))
  21.         (setq pt (cadr gr))
  22.         (if(and
  23.              (setq S1 (ssget "F" (LIST pt (list (car pt) (cadadr lmts)))'((0 . "*line"))))
  24.              (setq S2 (ssget "F" (LIST pt (list (car pt) (cadar  lmts)))'((0 . "*line"))))
  25.              (setq S3 (ssget "F" (LIST pt (list (caar lmts) (cadr pt)))'((0 . "*line"))))
  26.              (setq S4 (ssget "F" (LIST pt (list (caadr lmts)(cadr pt)))'((0 . "*line"))))
  27.            )
  28.           (progn
  29.             (setq P1 (trans (cadr(nth 3 (car (ssnamex S1)))) 0 1));上
  30.             (setq P2 (trans (cadr(nth 3 (car (ssnamex S2)))) 0 1));下
  31.             (setq P3 (trans (cadr(nth 3 (car (ssnamex S3)))) 0 1));左
  32.             (setq P4 (trans (cadr(nth 3 (car (ssnamex S4)))) 0 1));右
  33.             (setq
  34.               ys(list (car p4) (cadr p1))
  35.               yx(list (car p4) (cadr p2))
  36.               zx(list (car p3) (cadr p2))
  37.               zs(list (car p3) (cadr p1))
  38.             )
  39.             (redraw)
  40.             (grdraw zx zs 4)
  41.             (grdraw zs ys 4)
  42.             (grdraw ys yx 4)
  43.             (grdraw zx yx 4)
  44.             (grdraw zx ys 190)
  45.             (grdraw zs yx 190)
  46.           )
  47.           (redraw)
  48.         )
  49.       )
  50.       ((= 3 (car gr))
  51.         (setq loop nil)
  52.                                 (redraw)
  53.                                 (entmake (list '(0 . "line")(cons 10 zx)(cons 11 ys)))
  54.                                 (entmake (list '(0 . "line")(cons 10 zs)(cons 11 yx)))
  55.       )
  56.     )
  57.   )
  58.   (princ)
  59. )
回复 支持 1 反对 0

使用道具 举报

发表于 2023-6-14 17:33 | 显示全部楼层
  1. ;;;获取曲线的顶点
  2. (defun get_pline-vertexs (e / i v lst)
  3.   (setq i 0)
  4.   (while (setq v (vlax-curve-getpointatparam e (setq i (1+ i))))
  5.     (setq lst (cons v lst))
  6.   )
  7.   (reverse lst)
  8. )


发表于 2023-6-14 17:47 | 显示全部楼层
CGAL有这个算法,开源的
发表于 2023-6-14 19:26 | 显示全部楼层
本帖最后由 飞雪神光 于 2023-6-15 20:24 编辑

  1. (defun c:tt (/ )
  2.   (defun screen(/ c03 c08 c04 c05 c07 c06 c09 c01 c02);
  3.     (setq  
  4.       c03 (trans (getvar "viewctr") 1 2)
  5.       c08 (getvar "viewsize")
  6.       c04 (getvar "screensize")
  7.       c09 (/ (* c08 (car c04)) (cadr c04))
  8.       c01 (list (- (car c03) (* 0.5 c09)) (- (cadr c03) (* 0.5 c08)))
  9.       c02 (list (+ (car c03) (* 0.5 c09)) (+ (cadr c03) (* 0.5 c08)))
  10.       c01 (trans c01 2 1)
  11.       c02 (trans c02 2 1)
  12.     )
  13.     (list c01 c02)
  14.   )
  15.   (setq loop t)
  16.   (while loop
  17.     (setq gr (grread t 15 0))
  18.     (cond
  19.       ((= 5 (car gr))
  20.         (setq lmts (screen))
  21.         (setq pt (cadr gr))
  22.         (if(and
  23.              (setq S1 (ssget "F" (LIST pt (list (car pt) (cadadr lmts)))'((0 . "*line"))))
  24.              (setq S2 (ssget "F" (LIST pt (list (car pt) (cadar  lmts)))'((0 . "*line"))))
  25.              (setq S3 (ssget "F" (LIST pt (list (caar lmts) (cadr pt)))'((0 . "*line"))))
  26.              (setq S4 (ssget "F" (LIST pt (list (caadr lmts)(cadr pt)))'((0 . "*line"))))
  27.            )
  28.           (progn
  29.             (setq P1 (trans (cadr(nth 3 (car (ssnamex S1)))) 0 1));上
  30.             (setq P2 (trans (cadr(nth 3 (car (ssnamex S2)))) 0 1));下
  31.             (setq P3 (trans (cadr(nth 3 (car (ssnamex S3)))) 0 1));左
  32.             (setq P4 (trans (cadr(nth 3 (car (ssnamex S4)))) 0 1));右
  33.             (setq
  34.               ys(list (car p4) (cadr p1))
  35.               yx(list (car p4) (cadr p2))
  36.               zx(list (car p3) (cadr p2))
  37.               zs(list (car p3) (cadr p1))
  38.             )
  39.             (redraw)
  40.             (grdraw zx zs 1)
  41.             (grdraw zs ys 2)
  42.             (grdraw ys yx 3)
  43.             (grdraw zx yx 4)
  44.             (grdraw zx ys 5)
  45.             (grdraw zs yx 6)
  46.           )
  47.           (redraw)
  48.         )
  49.       )
  50.       ((= 3 (car gr))
  51.         (setq loop nil)
  52.       )
  53.     )
  54.   )
  55.   (princ)
  56. )

点评

(setq p1(mipt zs ys) p2(mipx yx) ... 多余了  发表于 2023-6-14 22:55

评分

参与人数 4明经币 +5 收起 理由
lee50310 + 1 赞一个!
bssurvey + 1 赞一个!
不一样地设计 + 1 很给力!
xyp1964 + 2 赞一个!

查看全部评分

发表于 2023-6-14 23:33 | 显示全部楼层
1.生成内轮廓,获取内轮廓所有顶点坐标,取最大最小点,根据最大最小点,生成对应镜像点,生成直线!
2.可以无视内轮廓中有其他图形,可以无视内轮廓形状,防止内伦敦顶点数量不为4.
3.增加判断.对于内轮廓顶点为4,但不是矩形的内轮廓,可以用曲线顶点依次获取,13-24分别直接绘制直线!
 楼主| 发表于 2023-6-15 08:08 | 显示全部楼层
本帖最后由 kzd2004 于 2023-6-15 15:34 编辑

大佬,提示输入的列表有缺陷,请保存lsp文件发给我,成分感谢!
 楼主| 发表于 2023-6-15 08:13 | 显示全部楼层
本帖最后由 kzd2004 于 2023-6-15 08:14 编辑
cq4920 发表于 2023-6-14 23:33
1.生成内轮廓,获取内轮廓所有顶点坐标,取最大最小点,根据最大最小点,生成对应镜像点,生成直线!
2.可 ...

关键是生成内轮廓,获取内轮廓所有顶点坐标,这个代码不知道怎么编写,请大佬帮忙一下。
发表于 2023-6-15 08:44 | 显示全部楼层
本帖最后由 htlaser 于 2023-6-15 08:45 编辑

作者不详  忘记了
  1. [code=lisp](defun outcurvept (en / n l ls1 ls2 lo po a b p1 p2 p11 p22)
  2.   (setq ob (vlax-ename->vla-object en))
  3.   (setq ls1 (list(cons 0.0(vlax-curve-getstartpoint ob))))  
  4.   (if  (wcmatch (vla-get-objectname ob) "*Polyline")
  5.     (setq n 0
  6.         x(while ;x仅匹配setq格式用
  7.             (setq po(vlax-curve-getpointatparam ob (setq n  (1+ n))))
  8.             (setq l  (vlax-curve-getDistAtParam ob n))
  9.             (setq ls2(append ls2(list(cons l po))));距离+坐标
  10.         )
  11.     )
  12.     (setq l(vlax-curve-getDistAtParam ob (vlax-curve-getendparam ob))
  13.       ls2(list(cons l(vlax-curve-getendpoint ob)))
  14.     );line,spline,circle,arc,ellipse
  15.   )  
  16.   (while
  17.     (setq p11(last ls1)  p22(car ls2))
  18.     (setq a  (car p11)  b  (- (car p22) a))
  19.     (setq p1 (cdr p11)  p2(cdr p22))
  20.     (if  (equal b(distance p1 p2) 1e-5);直线段不管
  21.       (setq ls2(cdr ls2) ls1(append ls1 (list p22)))
  22.       (setq lo (+(setq b(* b 0.5))a)
  23.           po(vlax-curve-getPointAtDist ob lo);中间点
  24.           x (if  (< (* b 0.9999) (distance p1 po))
  25.                 (setq ls2(cdr ls2) ls1(append ls1(list p22)))
  26.                 (setq ls2 (cons(cons lo po)ls2))
  27.             )
  28.       )      
  29.     )
  30.   );循环自适应
  31.   (mapcar 'cdr ls1)
  32. )
[/code]
 楼主| 发表于 2023-6-15 15:32 | 显示全部楼层
htlaser 发表于 2023-6-15 08:44
作者不详  忘记了[/code]

大佬,还是提示输入的列表有缺陷,要不请保存lsp文件给我,成分感谢!
发表于 2023-6-15 16:59 | 显示全部楼层
kzd2004 发表于 2023-6-15 15:32
大佬,还是提示输入的列表有缺陷,要不请保存lsp文件给我,成分感谢!

(outcurvept  (car (entsel "\n 拾取l轮廓: ")))
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-18 05:17 , Processed in 0.208591 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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