本帖最后由 dcl1214 于 2025-8-24 16:31 编辑

  1. (defun $xiang-dui-ju-zhong-dian$ (pt       lst
  2.           /       $addline$
  3.           $addpoint$
  4.           $point->polyline->reg->centroid$
  5.           $she-xian-qiu-jiao-dian$
  6.           acdocument     area
  7.           document     e-dbx
  8.           e-my       i
  9.           jds       my
  10.           qycs       to
  11.           zx
  12.          )
  13.           ;求质心,求居中点
  14.   (defun $point->Polyline->reg->centroid$
  15.             (pts0     lst     /
  16.              Area     centroid
  17.              doc     ent     ent-my
  18.              ent-polay     mp
  19.              obj     obj1     obj2
  20.              pts     tmp
  21.             )
  22.           ;坐标集求质心
  23.     (setq pts pts0)
  24.     (setq pts (vl-remove nil pts))
  25.     (setq pts (mapcar (function (lambda (a) (list (car a) (cadr a))))
  26.           pts
  27.         )
  28.     )
  29.     (SETQ pts (APPLY 'APPEND pts))
  30.     (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  31.     (if  (= (getvar 'ctab) "Model")
  32.       (setq mp (vla-get-modelSpace doc))
  33.       (setq mp (vla-get-paperSpace doc))
  34.     )
  35.     (and pts
  36.    (setq tmp (vl-catch-all-apply
  37.          'vlax-make-safearray
  38.          (LIST vlax-vbDouble
  39.          (cons 0 (- (length pts) 1))
  40.          )
  41.        )
  42.    )
  43.    (vl-catch-all-apply 'vlax-safearray-fill (LIST tmp pts))
  44.     )
  45.     (and doc
  46.    tmp
  47.    (setq
  48.      obj1
  49.       (vl-catch-all-apply
  50.         'vla-addLightweightPolyline
  51.         (LIST mp tmp)
  52.       )
  53.    )
  54.    (not (vl-catch-all-error-p obj1))
  55.    (progn (vl-catch-all-apply 'vla-Put-CLOSED (LIST obj1 1)) t)
  56.    (setq
  57.      OBJ2  (vl-catch-all-apply
  58.       'vla-addRegion
  59.       (list
  60.         mp
  61.         (vl-catch-all-apply
  62.           'vlax-make-variant
  63.           (list
  64.       (vl-catch-all-apply
  65.         'vlax-safearray-fill
  66.         (list
  67.           (vlax-make-safearray vlax-vbObject '(0 . 0))
  68.           (list obj1)
  69.         )
  70.       )
  71.           )
  72.         )
  73.       )
  74.     )
  75.    )
  76.    (not (vl-catch-all-error-p OBJ2))
  77.    (setq obj (car (vlax-safearray->list (vlax-variant-value obj2))))
  78.    (not (vl-catch-all-error-p obj))
  79.    (setq
  80.      centroid (vlax-safearray->list
  81.           (vlax-variant-value
  82.       (vla-get-Centroid
  83.         obj
  84.       )
  85.           )
  86.         )
  87.    )
  88.    (setq Area (vla-get-Area obj))
  89.     )
  90.     (vl-catch-all-apply 'vla-put-color (list obj 1))
  91.     (and obj (setq ent-my (vlax-vla-object->ename obj)))
  92.     (and obj1 (setq ent-polay (vlax-vla-object->ename obj1)))
  93.     (and ent-polay (entdel ent-polay))
  94.     (list
  95.       (cons "边界坐标" pts0)
  96.       (cons "面域" ent-my)
  97.       (cons "质心" centroid)
  98.       (cons "面积" Area)
  99.     )
  100.   )
  101.   (defun $addline$ (p1 p2)
  102.     (if  (and p1 p2)
  103.       (vla-addline
  104.   (vla-Get-ModelSpace
  105.     (vla-get-ActiveDocument
  106.       (vlax-get-acad-object)
  107.     )
  108.   )
  109.   (vlax-3D-Point p1)
  110.   (vlax-3D-Point p2)
  111.       )
  112.     )
  113.   )
  114.   (defun $addpoint$ (p)
  115.     (if  p
  116.       (VLA-addpoint
  117.   (vla-get-ModelSpace
  118.     (vla-get-ActiveDocument (vlax-get-acad-object))
  119.   )
  120.   (VLAX-3D-POINT p)
  121.       )
  122.     )
  123.   )
  124.   (defun $she-xian-qiu-jiao-dian$
  125.           (pt       lst       /
  126.            $intersectwith$     a
  127.            $addpoint$         e
  128.            generaterays         GetScreenCoords
  129.            gr       i         is
  130.            jd       jd-nots   jds
  131.            line       ll         lmts
  132.            maxdist   on         osmode
  133.            p       pts       pts-new
  134.            ray-count rays      ss
  135.            ur
  136.           )
  137.           ;射线求交点
  138.     (defun $IntersectWith$ (ent1 ent2 / jd obj1 obj2 ss sss)
  139.       (setq
  140.   obj1 (vl-catch-all-apply 'vlax-ename->vla-object (list ent1))
  141.       )
  142.       (setq
  143.   obj2 (vl-catch-all-apply 'vlax-ename->vla-object (list ent2))
  144.       )
  145.       (if (vl-catch-all-error-p obj1)
  146.   (setq obj1 nil)
  147.       )
  148.       (if (vl-catch-all-error-p obj2)
  149.   (setq obj2 nil)
  150.       )
  151.       (if (and obj1 obj2)
  152.   (setq jd (vl-catch-all-apply
  153.        'vlax-invoke
  154.        (list
  155.          obj1
  156.          'IntersectWith
  157.          obj2
  158.          acExtendNone
  159.        )
  160.      )
  161.   )
  162.       )
  163.       (if (vl-catch-all-error-p jd)
  164.   (setq jd nil)
  165.       )
  166.       (if jd
  167.   (if (> (length jd) 3)
  168.     (progn (setq sss nil)
  169.      (while  jd
  170.        (setq ss nil)
  171.        (setq
  172.          ss  (list (car jd) (cadr jd) (caddr jd))
  173.        )
  174.        (setq sss (cons ss sss))
  175.        (setq jd (cdddr jd))
  176.      )
  177.      (setq jd (reverse sss))
  178.     )
  179.     (setq jd (list jd))
  180.   )
  181.       )
  182.       jd
  183.     )
  184.     (defun GetScreenCoords (/ c03 c08 c04 c07 c06 c09 c01 c02)
  185.           ; 取得当前绘图区屏幕的左下角和右上角的坐标
  186.       (setq c03  (getvar "viewctr")
  187.       c03  (trans c03 1 2)
  188.       c08  (getvar "viewsize")
  189.       c04  (getvar "screensize")
  190.       c07  (car c04)
  191.       c06  (cadr c04)
  192.       c09  (/ (* c08 c07) c06)
  193.       c01  (list (- (car c03) (* 0.5 c09)) (- (cadr c03) (* 0.5 c08)))
  194.       c02  (list (+ (car c03) (* 0.5 c09)) (+ (cadr c03) (* 0.5 c08)))
  195.       c01  (trans c01 2 1)
  196.       c02  (trans c02 2 1)
  197.       )
  198.       (list c01 c02)
  199.     )
  200.     (defun GenerateRays  (center dist count / ang step rays)
  201.       (setq ang   0.0
  202.       step (/ 360.0 count)
  203.       )
  204.       (repeat count
  205.   (setq rays (cons (polar center (* ang (/ pi 180)) dist) rays)
  206.         ang  (+ ang step)
  207.   )
  208.       )
  209.       rays
  210.     )
  211.     (if  pt
  212.       (progn
  213.   (setq ray-count (cdr (assoc "射线条数" lst)))
  214.   (if (and ray-count (= (type ray-count) 'int))
  215.     ()
  216.     (setq ray-count 72)
  217.   )
  218.   (or ray-count (setq ray-count 36))
  219.   (setq lmts (GetScreenCoords))
  220.   (setq maxdist (distance (car lmts) (cadr lmts))
  221.         rays    (GenerateRays pt maxdist ray-count)
  222.         pts     nil
  223.   )
  224.   (setq i 0)
  225.   (setq jd-nots nil)
  226.   (foreach ray rays
  227.     (setq jd nil)
  228.     (if
  229.       (and (setq
  230.        ss (ssget
  231.       "F"
  232.       (list pt ray)
  233.       (list
  234.           ;(cons -4 "<AND")
  235.         (cons 0 "CIRCLE,LINE,*line,ellipse,arc,SPLINE")
  236.           ;(cons -4 "<NOT")
  237.           ;(CONS 8 "tishi")
  238.           ;(cons -4 "NOT>")
  239.           ;(cons -4 "AND>")
  240.       )
  241.           )
  242.      )
  243.      (setq e (cadar (ssnamex ss)))
  244.      (setq p (trans (cadar (cdddar (ssnamex ss))) 0 1))
  245.       )
  246.        (progn
  247.          (setq jd nil)
  248.          (setq line ($addline$ pt ray))
  249.          (setq line (vlax-vla-object->ename line))
  250.          (setq
  251.      jds (vl-catch-all-apply
  252.            (function
  253.        (lambda ()
  254.          ($IntersectWith$ e line)
  255.        )
  256.            )
  257.          )
  258.          )
  259.          (IF JDS
  260.      ()
  261.      (progn
  262.        (setq jd-nots (cons (list pt ray) jd-nots))
  263.      )
  264.          )
  265.          (entdel line)
  266.          (if (vl-catch-all-error-p jds)
  267.      (setq jds nil)
  268.          )
  269.          (setq jds
  270.           (vl-sort jds
  271.              (function (lambda (e1 e2)
  272.              (< (distance e1 pt)
  273.                 (distance e1 pt)
  274.              )
  275.            )
  276.              )
  277.           )
  278.          )
  279.          (setq jd (car jds))
  280.          (if (vl-catch-all-error-p jd)
  281.      (setq jd nil)
  282.          )
  283.          (if jd
  284.      (setq
  285.        pts (cons (cons i jd) pts)
  286.      )
  287.          )
  288.        )
  289.        (PRINT "ssget没有搜索到图元") ;ssget没有搜索到图形
  290.     )
  291.     (setq i (1+ i))
  292.     (setq ss nil)
  293.   )
  294.   (setq pts (mapcar 'cdr pts))
  295.       )
  296.     )
  297.     pts
  298.   )
  299.   (if pt
  300.     (progn
  301.       (setq Document (vla-get-ActiveDocument (vlax-get-acad-object)))
  302.       (vla-StartUndoMark Document)
  303.       (setq qycs (cdr (assoc "取样次数" lst)))
  304.       (if (and qycs (= (type qycs) 'int))
  305.   ()
  306.   (setq qycs 2)
  307.       )
  308.       (or qycs (setq qycs 1))
  309.       (setq i 1)
  310.       (setq to t)
  311.       (while (and to (<= i qycs))
  312.   (setq my
  313.          (vl-catch-all-apply
  314.      (function
  315.        (lambda (/ jds my)
  316.          (setq
  317.            jds ($she-xian-qiu-jiao-dian$ pt LST)
  318.          )
  319.          (setq my ($point->Polyline->reg->centroid$ jds nil))
  320.          my
  321.        )
  322.      )
  323.          )
  324.   )
  325.   (if (vl-catch-all-error-p my)
  326.     (setq my nil)
  327.   )
  328.   (setq zx (cdr (assoc "质心" my)))
  329.   (setq e-my (cdr (assoc "面域" my)))
  330.   (setq area (cdr (assoc "面积" my)))
  331.   (setq jds (cdr (assoc "边界坐标" my)))
  332.   (if (/= i qycs)
  333.     (if (and e-my (entget e-my))
  334.       (entdel e-my)
  335.     )
  336.   )
  337.   (if zx
  338.     (setq pt zx)
  339.     (setq to nil)      ;第一次如果失败了,后面就不用再跑了,直接让while跳出循环
  340.   )
  341.   (setq i (1+ i))
  342.       )
  343.       (vla-EndUndoMark Document)
  344.     )
  345.   )
  346.   (if zx
  347.     (setq zx (list (car zx) (cadr zx) 0))
  348.   )
  349.   (if (vl-position (cdr (assoc "绘制射线" lst)) (list "1" "是"))
  350.     (progn (vl-catch-all-apply
  351.        'vla-add
  352.        (list (vla-get-Layers
  353.          (setq AcDocument
  354.           (vla-get-ActiveDocument
  355.             (vlax-get-acad-object)
  356.           )
  357.          )
  358.        )
  359.        "tishi"
  360.        )
  361.      )
  362.      (mapcar
  363.        (function
  364.          (lambda (a / obj)
  365.      (setq obj ($addline$ zx A))
  366.      (vl-catch-all-apply 'vla-put-layer (list obj "tishi"))
  367.      (vla-put-color obj 3)
  368.          )
  369.        )
  370.        jds
  371.      )
  372.     )
  373.   )
  374.   (if (cdr (assoc "保留面域" lst))
  375.     ()
  376.     (progn (entdel e-my) (setq e-my nil))
  377.   )
  378.   (list
  379.     (cons "面域" e-my)
  380.     (cons "边界坐标" jds)
  381.     (cons "居中点坐标" zx)
  382.     (cons "质心" zx)
  383.     (cons "面积" area)
  384.   )
  385. )
  386. (DEFUN C:tt (/ *ERROR* PT-NEW jzd)
  387.   (DEFUN *ERROR* (S) (PRINT))
  388.   (setq pt (GETPOINT "请在区域内点击一点开始求相对居中点"))
  389.   (setq  jzd ($xiang-dui-ju-zhong-dian$
  390.         pt
  391.         (list (cons "射线条数" 48)
  392.         (cons "绘制射线" "1")
  393.         (CONS "取样次数" 2)
  394.         (CONS "保留面域" t)
  395.         )
  396.       )
  397.   )
  398.   (SETQ PT-NEW (cdr (assoc "居中点坐标" jzd)))
  399.   (princ)
  400. )


网友答: 感谢分享,这一般用在什么声景?

网友答: 感谢分享,这一般用在什么声景?

网友答: 感谢分享。。

网友答: 建议明经版主给dcl1214 开一个像猫老师,高飞大师等等大佬们一样的专栏

网友答: 感谢分享
  • 上一篇:ACAD,中望,浩辰侧边栏
  • 下一篇:没有了