明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3549|回复: 22

[讨论] 有人说,这个还不错

  [复制链接]
发表于 2022-12-9 15:51:28 | 显示全部楼层 |阅读模式
本帖最后由 自贡黄明儒 于 2022-12-14 11:59 编辑

在QQ上发布了这个,其实没什么用处。有人说,这个还不错,那就分享给大家

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;点集质心 by csharp
  2. ;;点集数量大于3个,不能交叉,不能共线
  3. (defun xd::pnts:centroid (pts / x0 y0 s gx gy x1 x2 y1 y2 tmp)
  4.   (setq        x0  (caar pts)
  5.         y0  (cadar pts)
  6.         pts (cdr pts)
  7.         s   0.0
  8.         gx  0.0
  9.         gy  0.0
  10.   )
  11.   (while (cdr pts)
  12.     (setq x1  (caar pts)
  13.           y1  (cadar pts)
  14.           x2  (caadr pts)
  15.           y2  (cadadr pts)
  16.           tmp (- (* (- x1 x0) (- y2 y0)) (* (- x2 x0) (- y1 y0)))
  17.           s   (+ s tmp)
  18.           gx  (+ gx (* tmp (/ (+ x0 x1 x2) 3.0)))
  19.           gy  (+ gy (* tmp (/ (+ y0 y1 y2) 3.0)))
  20.     )
  21.     (setq pts (cdr pts))
  22.   )
  23.   (list (/ gx s) (/ gy s) 0.0)
  24. )
  25. ;;点集最远2点 MJ:lensort
  26. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;点集质心 by csharp

  27. ;;3 多段线顶点
  28. ;;(_HH:GetLwPts (car(entsel)))=>((1.0 0.0) (1.0 1.0) (0.0 1.0) (0.0 0.0))
  29. (defun _HH:GetLwPts (e / PTS)
  30.   (foreach x (entget e)
  31.     (if  (= (car x) 10)
  32.       (setq pts (cons (cdr x) pts))
  33.     )
  34.   )
  35.   (reverse pts)
  36. )

  37. ;;判断点是否在矩形内;pts(左下角 右上角)
  38. (defun PInRectang-p (pts p / LD RU)
  39.   (setq LD (car pts))
  40.   (setq RU (cadr pts))
  41.   (and
  42.     (<= (car LD) (car p) (car RU))
  43.     (<= (cadr LD) (cadr p) (cadr RU))
  44.   )
  45. )

  46. ;;;-----------------------------------------------------------;;
  47. ;;; 旋转向量到指定角度                                        ;;
  48. ;;; 输入: 一个向量和指定的角度                                ;;
  49. ;;; 输出: 被旋转后的向量                                      ;;
  50. ;;;-----------------------------------------------------------;;
  51. (defun MAT:Rot2D (v a / c s x y)
  52.   (setq c (cos a) s (sin a))
  53.   (setq x (car v) y (cadr v))
  54.   (list (- (* x c) (* y s)) (+ (* x s) (* y c)))
  55. )

  56. ;;;----------------------------------------------------;
  57. ;;;功能: 以基点旋转一点到指定的角度                    ;
  58. ;;;输入: 要旋转的点Pt,基点和旋转角度                  ;
  59. ;;;输出: 旋转后点位置                                  ;
  60. ;;;----------------------------------------------------;
  61. (defun GEO:Rot2D (Pt PtBase Ang)  
  62.   (mapcar '+ PtBase (MAT:Rot2D (mapcar '- Pt PtBase) Ang))
  63. )

  64. ;;p不在包围盒内,中心点Cen超出到P的角度决定
  65. (defun x11 (Cen p pts / A ANG ANG1 ANGS ANGS1 CEN D I L L1 LD P1 P2 PTS1 PTS2 PTS3 RU X Y)
  66.   ;;圆整角度
  67.   (setq ang (angle Cen p))
  68.   (setq ang1 (/ (* ang 180) pi))
  69.   (setq  angS (list -15  0    15    30   45   60   75   90   105  120
  70.        135  150  165  180  195  210   225  240  255  270
  71.        285  300  315  330  345  360   375
  72.       )
  73.   )
  74.   (setq angS1 (mapcar '(lambda (x y) (* (+ x y) 0.5)) angS (cdr angS)))
  75.   (setq angS1 (mapcar '(lambda (x y) (<= x ang1 y)) angS1 (cdr angS1)))
  76.   (setq i (1+ (VL-POSITION T angS1)))
  77.   (setq ang (nth i angS))
  78.   (if (= ang 360)
  79.     (setq ang 0)
  80.   )
  81.   (setq ang (/ (* pi ang) 180))

  82.   ;;点集pts绕Cen顺时针旋转ang
  83.   (setq  pts1
  84.    (mapcar (function
  85.        (lambda (x) (GEO:Rot2D x Cen (- ang)))
  86.      )
  87.      pts
  88.    )
  89.   )
  90.   ;;最小 最大点
  91.   (setq LD (apply 'mapcar (cons 'min pts1)))
  92.   (setq RU (apply 'mapcar (cons 'max pts1)))
  93.   (setq p1 (list (car RU) (cadr LD)))
  94.   (setq p2 RU)
  95.   ;;p1 p2转回去
  96.   (setq p1 (GEO:Rot2D p1 Cen ang))
  97.   (setq p2 (GEO:Rot2D p2 Cen ang))
  98.   ;;pts到p1-p2垂点,且不与pts各连线无交点的点
  99.   (setq  pts1        ;多段线上点向p1 p2方向画垂线
  100.    (mapcar (function
  101.        (lambda (x)
  102.          (polar x ang 100)
  103.        )
  104.      )
  105.      pts
  106.    )
  107.   )
  108.   ;;pts到p1-p2垂点
  109.   (setq  pts1 (mapcar (function
  110.            (lambda (x y) (list y (inters p1 p2 x y nil)))
  111.          )
  112.          pts1
  113.          pts
  114.        )
  115.   )

  116.   (setq pts2 (cons (last pts) pts))
  117.   (setq pts3 pts)
  118.   (setq L1 nil)
  119.   (foreach a pts1      ;a(多段线上点 垂点)
  120.     (setq
  121.       L
  122.        (mapcar (function (lambda (x y) (inters (car a) (cadr a) x y)))
  123.          pts2
  124.          pts3
  125.        )
  126.     )
  127.     ;;去掉多段线本身的点,由于计算误差,可能去不掉
  128.     (foreach x pts
  129.       (setq L (mapcar '(lambda (y)
  130.        (if (equal x y 0.00001)
  131.          nil
  132.          y
  133.        )
  134.            )
  135.           L
  136.         )
  137.       )
  138.     )
  139.     (setq L (VL-REMOVE nil L))
  140.     ;;记录没有交点的垂点
  141.     (if  L
  142.       nil
  143.       (setq L1 (cons (car a) L1))
  144.     )
  145.   )

  146.   ;到p1 p2的距离
  147.   (setq d (car (trans (mapcar '- p p1) 0 (mapcar '- p2 p1))))
  148.   (setq d (abs d))
  149.   ;;新p1 p2
  150.   (setq p1 (polar p1 ang d))
  151.   (setq p2 (polar p2 ang d))

  152.   ;;L1线上的点,画出到P1P2的垂点
  153.   (setq  pts1
  154.    (mapcar (function
  155.        (lambda (x)
  156.          (polar x ang 100)
  157.        )
  158.      )
  159.      L1
  160.    )
  161.   )
  162.   ;;pts到p1-p2垂点
  163.   (setq  pts1 (mapcar (function
  164.            (lambda (x y) (list y (inters p1 p2 x y nil)))
  165.          )
  166.          pts1
  167.          L1
  168.        )
  169.   )
  170.   (grdraw p1 p2 1 1)
  171.   (mapcar (function (lambda (x) (grdraw (car x) (cadr x) 1 1)))
  172.     pts1
  173.   )
  174.   pts1
  175. )

  176. ;;画轴测图
  177. (defun x1 (e / CEN LD P PTS RU pts1)
  178.   ;;顶点坐标
  179.   (setq pts (_HH:GetLwPts e))
  180.   ;;质心
  181.   (setq Cen (xd::pnts:centroid pts))
  182.   ;;最小 最大点
  183.   (setq LD (apply 'mapcar (cons 'min pts)))
  184.   (setq RU (apply 'mapcar (cons 'max pts)))
  185.   
  186.   (WHILE (and (setq TMP (grread t 4 2))
  187.         (setq mode (car TMP))
  188.         (not (or (equal mode 3);鼠标左键
  189.            (equal mode 11);鼠标右键,右键设置为回车时
  190.            (equal mode 25);鼠标右键,右键设置为屏幕菜单时
  191.            (equal TMP '(2 13));回车,不能用=
  192.            (equal TMP '(2 32));空格,不能用=
  193.        )
  194.         )
  195.    )
  196.     (setq pts1 nil)
  197.     (redraw)
  198.     (setq p (cadr TMP))      ;鼠标位置p
  199.     (if  (PInRectang-p (list LD RU) p)
  200.       (mapcar (function (lambda (x) (grdraw x p 1 1))) pts)
  201.       (setq pts1 (x11 Cen p pts))
  202.     )
  203.   )
  204.   (if pts1
  205.     (mapcar
  206.       (function
  207.   (lambda  (x)
  208.     (entmakeX
  209.       (list '(0 . "LINE") (cons 10 (car x)) (cons 11 (cadr x)))
  210.     )
  211.   )
  212.       )
  213.       pts1
  214.     )
  215.   )
  216. )
  217. (defun C:x1 (/ E)
  218.   (setq e (car (entsel)))
  219.   (x1 e)
  220.   (princ)
  221. )



顺便说一下,上面说的“有人”,是“友人”,更可能是“王婆”

本帖子中包含更多资源

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

x

评分

参与人数 2明经币 +1 金钱 +40 收起 理由
guosheyang + 1 + 20 很给力!
tigcat + 20 最喜欢看动画

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2022-12-13 17:23:18 | 显示全部楼层
本帖最后由 llsheng_73 于 2022-12-13 17:53 编辑
20060510412 发表于 2022-12-12 12:30
请教黄大师,对于非封闭的图元,当向上投影的时候,得到上面的形状。
能否改为下面的形状呢?

  1. (vl-load-com)
  2. (defun xyofen(e fun / p i pt n en)
  3.   (or(=(type e)'ename)(setq e(vlax-vla-object->ename e)))
  4.   (cond((vl-position'(0 . "LINE")(setq en(entget e)))
  5.         (list(vlax-curve-getstartpoint e)(vlax-curve-getendpoint e)))
  6.        ((WCMATCH(cdr(assoc 0 en))"*POLYLINE")
  7.         (setq i -1 n(vlax-curve-getEndParam e))
  8.         (while(< i n)
  9.           (setq i(1+ i)p(vlax-curve-getPointAtParam e i))
  10.           (or(equal(car pt)p fun)(setq pt(cons p pt))))
  11.         (reverse pt))
  12.        (t(vl-remove'nil(mapcar'(lambda(x)(cdr(assoc x en)))'(10 11 12 13 14))))))
  13. (defun s2e(s / n lst)(if(=(type s)'pickset)(repeat(setq n(sslength s))(setq n(1- n)lst(cons(ssname s n)lst)))))
  14. (defun PerLn(p p1 p2);;;点p到p1,p2所在直线垂距及垂足
  15.   (setq p2(mapcar'- p1 p2))
  16.   (list(abs(car(trans(mapcar'- p1 p) 0 p2)))
  17.        (trans(mapcar'+(mapcar'*'(1 1 0)(trans p1 0 p2))(mapcar'*'(0 0 1)(trans p 0 p2)))p2 0)))
  18. (defun delsame(l1 fuz / l2);;带容差去重(重复过的取第一次出现)
  19.       (while l1(setq l2(cons(car l1)l2)l1(vl-remove-if'(lambda (x)(equal(car l1)x fuz))(cdr l1))))
  20.       (reverse l2))
  21. (defun ScreenWid();;当前屏幕宽度
  22.   (*(apply'/(getvar'screensize))(getvar'viewsize)))
  23. (defun c:tt(/ s pt pts p o w ls)
  24.   (while(setq s(s2e(ssget)))
  25.     (and(setq a nil pt nil o(getpoint"指定参考线上一点"))
  26.         (vl-every(function(lambda(x)(setq pt(cons(xyofen x 1e-3)pt))))s)
  27.         (setq pts(delsame(apply(function append)pt)1e-3))
  28.         (while(/=(car(mapcar(function set)'(a p)(grread 5)))3)(redraw)
  29.           (setq ls nil)
  30.           (if(= a 5)
  31.             (progn
  32.               (grdraw(polar o(angle p o)(setq w(ScreenWid)))(polar p(angle o p)w)5)
  33.               (vl-some(function(lambda(x / q s)
  34.                                  (setq q(cadr(PerLn x p o)))
  35.                                  (or(vl-some(function(lambda(a)
  36.                                                        (vl-some(function(lambda(a b / o)(and(setq o(inters x q a b))(not(equal x o 1e-3)))))a(cdr a))))pt)
  37.                                     (grdraw x q 4)
  38.                                     (setq ls(cons(list x q)ls)))nil))pts)))))
  39.         (if(= a 3)(vl-every(function(lambda(x)(entmakex(list'(0 . "line")(cons 10(car x))(cons 11(cadr x))'(62 . 4)))))ls))
  40.         ))

没有象黄老师那样搞自动参考线,需要自己通过两点确定参考方向,也没有计算所需要的参考线长度

本帖子中包含更多资源

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

x

点评

真厉害,赞  发表于 2022-12-13 21:15

评分

参与人数 2明经币 +2 收起 理由
自贡黄明儒 + 1 很给力!
guosheyang + 1 赞一个!

查看全部评分

回复 支持 2 反对 0

使用道具 举报

发表于 2022-12-9 17:30:51 | 显示全部楼层
跟我很多年前写的投影,有点类似,但是老黄这个强一点,各个方向都支持
简单的投影程序
http://bbs.mjtd.com/forum.php?mo ... &fromuid=399892
(出处: 明经CAD社区)
发表于 2022-12-9 16:05:46 | 显示全部楼层
谢谢!很厉害
发表于 2022-12-9 16:17:26 | 显示全部楼层
错误: 除数为零 操作 有什么条件吗

点评

多边形必须是一块钢板  发表于 2022-12-9 16:35
看看是不是这个函数xd::pnts:centroid引起的,不能交叉  发表于 2022-12-9 16:29
发表于 2022-12-9 16:33:45 | 显示全部楼层
可以了 画的线形问题 谢谢
发表于 2022-12-9 16:45:29 | 显示全部楼层
好厉害,实时绘图很强大
发表于 2022-12-9 18:32:28 | 显示全部楼层
谢谢分享 ,学习一下
发表于 2022-12-9 20:15:54 | 显示全部楼层


谢谢分享 ,学习一下
发表于 2022-12-10 08:54:09 | 显示全部楼层
666666666666666666666
发表于 2022-12-12 12:09:47 | 显示全部楼层
老师:快捷命令是什么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-26 23:19 , Processed in 0.209886 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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