明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4532|回复: 15

急寻一个画中心线的好方法或程序

[复制链接]
发表于 2006-8-6 13:18 | 显示全部楼层 |阅读模式
急寻一个画中心线的好方法或程序!谢过!
发表于 2021-3-1 18:31 | 显示全部楼层
  1. ;;--------------=={ Associative Centerlines }==---------------;;

  2. (defun c:cl ( / _line ss e c r l1 l2 )
  3.   (if
  4.     (and
  5.       (setq ss
  6.         (ssget
  7.           (list '(0 . "CIRCLE") '(-4 . "<NOT") (list -3 (list cl:app)) '(-4 . "NOT>"))
  8.         )
  9.       )
  10.       (or (tblsearch "APPID" cl:app) (regapp cl:app))
  11.     )
  12.     (progn
  13.       (defun _line ( p1 p2 h )
  14.         (entmakex
  15.           (list (cons 0 "LINE") (cons 10 p1) (cons 11 p2)
  16.             (list -3
  17.               (list cl:app
  18.                 (cons 1002 "{") (cons 1005 h) (cons 1002 "}")
  19.               )
  20.             )
  21.           )
  22.         )
  23.       )
  24.       (repeat (setq i (sslength ss))
  25.         (setq e  (entget (ssname ss (setq i (1- i))))
  26.               h  (cdr (assoc  5 e))
  27.               c  (cdr (assoc 10 e))
  28.               r  (* cl:ratio (cdr (assoc 40 e)))
  29.               l1 (_line (polar c 0. r) (polar c pi r) h)
  30.               l2 (_line (polar c (/ pi 2.) r) (polar c (/ (* 3. pi) 2.) r) h)
  31.         )
  32.         (entmod
  33.           (list (assoc -1 e)
  34.             (list -3
  35.               (list cl:app
  36.                 (cons 1002 "{")
  37.                 (cons 1005 (cdr (assoc 5 (entget l1))))
  38.                 (cons 1005 (cdr (assoc 5 (entget l2))))
  39.                 (cons 1002 "}")
  40.               )
  41.             )
  42.           )
  43.         )
  44.         (vlr-object-reactor (list (vlax-ename->vla-object (cdr (assoc -1 e)))) (list cl:app h)
  45.           (list
  46.             (cons :vlr-modified 'cl:circle:callback)
  47.           )
  48.         )
  49.         (vlr-object-reactor (mapcar 'vlax-ename->vla-object (list l1 l2)) (list cl:app h)
  50.           (list
  51.             (cons :vlr-modified 'cl:line:callback)
  52.           )
  53.         )
  54.       )
  55.     )
  56.   )
  57.   (princ)
  58. )

  59. ;;------------------------------------------------------------;;

  60. (defun c:clremove ( / _massoc ss fl i e r d h x )

  61.   (defun _massoc ( x l )
  62.     (if (setq a (assoc x l))
  63.       (cons (cdr a) (_massoc x (cdr (member a l))))
  64.     )
  65.   )
  66.   
  67.   (princ "\nSelect Circles to Remove Associativity <All>: ")
  68.   (setq fl (list '(0 . "CIRCLE") (list -3 (list cl:app))) i -1)
  69.   
  70.   (if
  71.     (setq ss
  72.       (cond
  73.         ( (ssget fl) )
  74.         ( (ssget "_X" fl) )
  75.       )
  76.     )
  77.     (while (setq e (ssname ss (setq i (1+ i)))) (setq e (entget e (list cl:app)))
  78.       (foreach r (cdar (vlr-reactors :vlr-object-reactor))
  79.         (if
  80.           (and
  81.             (setq d (vlr-data r))
  82.             (listp d)
  83.             (eq cl:app (car d))
  84.             (or (not (cadr d)) (eq (cdr (assoc 5 e)) (cadr d)))
  85.           )
  86.           (vlr-remove r)
  87.         )
  88.       )
  89.       (foreach h (_massoc 1005 (cdadr (assoc -3 e)))
  90.         (if (setq x (entget (handent h)))
  91.           (entmod (list (assoc -1 x) (list -3 (list cl:app))))
  92.         )
  93.       )
  94.       (entmod (list (assoc -1 e) (list -3 (list cl:app))))
  95.     )
  96.   )
  97.   (princ)
  98. )      

  99. ;;------------------------------------------------------------;;

  100. (defun cl:circle:callback ( owner reactor params / xtyp xval c r )
  101.   (if
  102.     (and
  103.       (vlax-read-enabled-p owner)
  104.       (progn (vla-getxdata owner cl:app 'xtyp 'xval) xval)
  105.       (setq
  106.         c (vlax-get owner 'center)
  107.         r (* cl:ratio (vlax-get owner 'radius))
  108.       )
  109.     )
  110.     (mapcar
  111.       (function
  112.         (lambda ( h a )
  113.           (if (or (entget (setq h (handent h))) (entdel h))
  114.             (entmod
  115.               (list (cons -1 h) (cons 10 (polar c a r)) (cons 11 (polar c (+ a pi) r)))
  116.             )
  117.           )
  118.         )
  119.       )
  120.       (cddr (mapcar 'vlax-variant-value (vlax-safearray->list xval))) (list 0. (/ pi 2.))
  121.     )
  122.   )
  123.   (princ)
  124. )

  125. ;;------------------------------------------------------------;;

  126. (defun cl:line:callback ( owner reactor params )
  127.   (setq *data (list owner reactor))
  128.   (vlr-command-reactor (list cl:app)
  129.     (list
  130.       (cons :vlr-commandended     'cl:line:modify)
  131.       (cons :vlr-commandcancelled 'cl:line:cancelled)
  132.       (cons :vlr-commandfailed    'cl:line:cancelled)
  133.     )
  134.   )
  135.   (vlr-remove reactor)
  136.   (princ)  
  137. )

  138. ;;------------------------------------------------------------;;

  139. (defun cl:line:modify ( reactor params / xtyp xval h ) (vlr-remove reactor)
  140.   (if
  141.     (and *data (not (vlax-erased-p (car *data))) (progn (vla-getxdata (car *data) cl:app 'xtyp 'xval) xval)   
  142.       (or
  143.         (entget
  144.           (setq h
  145.             (handent
  146.               (caddr
  147.                 (mapcar 'vlax-variant-value (vlax-safearray->list xval))
  148.               )
  149.             )
  150.           )
  151.         )
  152.         (entdel h)
  153.       )
  154.     )
  155.     (progn
  156.       (cl:circle:callback (vlax-ename->vla-object h) nil nil)
  157.       (vlr-add (cadr *data))
  158.       (setq *data nil)
  159.     )
  160.   )   
  161.   (princ)
  162. )

  163. ;;------------------------------------------------------------;;

  164. (defun cl:line:cancelled ( reactor params ) (vlr-remove reactor)
  165.   (if *data
  166.     (progn
  167.       (vlr-add (cadr *data))
  168.       (setq *data nil)
  169.     )
  170.   )
  171.   (princ)
  172. )

  173. ;;------------------------------------------------------------;;

  174. (
  175.   (lambda ( / r d s i e o xtyp xval )
  176.     (foreach r (cdar (vlr-reactors :vlr-object-reactor))
  177.       (if (and (setq d (vlr-data r)) (listp d) (eq cl:app (car d)))
  178.         (vlr-remove r)
  179.       )
  180.     )
  181.     (if (setq s (ssget "_X" (list '(0 . "CIRCLE") (list -3 (list cl:app)))))
  182.       (repeat (setq i (sslength s))
  183.         (setq e (ssname s (setq i (1- i))))
  184.         (vlr-object-reactor (list (setq o (vlax-ename->vla-object e))) (list cl:app (cdr (assoc 5 (entget e))))
  185.           (list
  186.             (cons :vlr-modified 'cl:circle:callback)
  187.           )
  188.         )
  189.         (vla-getxdata o cl:app 'xtyp 'xval) (setq xval (mapcar 'vlax-variant-value (vlax-safearray->list xval)))
  190.         (vlr-object-reactor
  191.           (mapcar
  192.             (function
  193.               (lambda ( h )
  194.                 (or (entget (setq h (handent h))) (entdel h)) (vlax-ename->vla-object h)
  195.               )
  196.             )
  197.             (list (caddr xval) (cadddr xval))
  198.           )
  199.           (list cl:app (cdr (assoc 5 (entget e)))) (list (cons :vlr-modified 'cl:line:callback))
  200.         )
  201.       )
  202.     )
  203.   )
  204. )

  205. (vl-load-com) (princ)

  206. ;;------------------------------------------------------------;;
  207. ;;                         End of File                        ;;
  208. ;;------------------------------------------------------------;;
发表于 2019-12-23 13:19 | 显示全部楼层
很好,前面还有一个,是分层,但不能框选,只能点选的。程序源码如下:

;;*************************;;
;;CL.lsp:     
;;Designed by pengliang  ;;
;;2005.4.21;;
;;*************************;;

(defun c:cl ()
   (setvar "cmdecho" 0)
   (setq os_old (getvar "osmode"))
   (setq cl_old (getvar "clayer"))
   (setvar "osmode" 0)
   (command "ucs" "")
;-----------------------------------------------------------------------------------------
   (if (not (tblsearch "layer" "cen"))
       (command "_.layer" "_new" "cen" "_color" "1" "cen" "_ltype" "center" "cen" "")
       (command "_.layer" "thaw" "cen" "on" "cen" "unlock" "cen" "")
   )
;------------------------------------------------------------------------------------------
  (setq a1 (entsel "\n请选定要画中心线的圆\\圆弧\\直线:"))
  (while (null a1)
       (setq a1 (entsel "\n请选定要画中心线的圆\\圆弧\\直线:"))
  )
  (setq a2 (entget (car a1)))
  (setq l1 (assoc 0 a2))
  (setq l2 (cdr l1))
  (while (and (/= l2 "LINE") (/= l2 "ARC") (/= l2 "CIRCLE"))
         (setq a1 (entsel "\n所选的不是圆\\圆弧\\直线:"))
         (while (null a1)
            (setq a1 (entsel "\n请选定要画中心线的圆\\圆弧\\直线:"))
         )
         (setq pt1 (cadr a1))
         (setq a2 (entget (car a1)))
         (setq l1 (assoc 0 a2))
         (setq l2 (cdr l1))
  )
  (if (or (= l2 "ARC") (= l2 "CIRCLE"))
      (progn
          (setq b1 (cdr (assoc 10 a2)))  ;圆心座标
          (setq b2 (cdr (assoc 40 a2)))  ;圆半径
          (setvar "clayer" "cen")
          (command "line" (list (- (car b1) (* b2 1.2)) (cadr b1)) (strcat "@" (rtos (* b2 2.4))
                          "<0") "")
          (command "array" "l" "" "p" b1 "2" "90" "")
      )
   )
  (if (or (= l2 "LINE"))
      (progn
          (setq a3 (entsel "\n请选定另一直线:"))
          (while (null a3)
                 (setq a3 (entsel "\n请选定另一直线:"))
          )
          (setq a4 (entget (car a3)))
          (setq end1 (cdr (assoc 10 a2)))
          (setq end2 (cdr (assoc 11 a2)))
          (setq end3 (cdr (assoc 10 a4)))
          (setq end4 (cdr (assoc 11 a4)))
          (setq e1 (distance end1 end3))
          (setq e2 (distance end1 end4))
          (if (< e1 e2)
             (progn
              (setq end5 (list (/ (+ (car end1) (car end3)) 2.0) (/ (+ (cadr end1) (cadr end3)) 2.0)))
              (setq end6 (list (/ (+ (car end2) (car end4)) 2.0) (/ (+ (cadr end2) (cadr end4)) 2.0)))
             )
             (progn
              (setq end5 (list (/ (+ (car end1) (car end4)) 2.0) (/ (+ (cadr end1) (cadr end4)) 2.0)))
              (setq end6 (list (/ (+ (car end2) (car end3)) 2.0) (/ (+ (cadr end2) (cadr end3)) 2.0)))
             )
          )
          (setq end5_1 (polar end5 (angle end6 end5) 10))
          (setq end6_1 (polar end6 (angle end5 end6) 10))
          (setvar "clayer" "cen")
          (command "line" end5_1 end6_1 "")
      )
   )
   (setvar "osmode" os_old)
   (setvar "clayer" cl_old)
   (princ)
)
发表于 2020-8-3 16:09 | 显示全部楼层
phoenixdjq 发表于 2006-11-19 22:09
我以前编的,但是用的是当前层的线型,因为只是自己用
你可以试一下,如果有问题的话,可以再联系

谢谢分享。
发表于 2006-8-9 11:13 | 显示全部楼层
建议楼主不妨试试XRCAD V7.0(http://www.xrsoftware.net)中的“绘制工具”,可轻松实现圆/圆弧、直线间及圆弧间的中心线绘制功能。
发表于 2006-8-12 23:08 | 显示全部楼层
intecad功能强大,什么都有。
 楼主| 发表于 2006-8-19 21:43 | 显示全部楼层

好的,谢谢各位!

发表于 2006-11-19 22:09 | 显示全部楼层

我以前编的,但是用的是当前层的线型,因为只是自己用

你可以试一下,如果有问题的话,可以再联系

本帖子中包含更多资源

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

x

点评

谢谢分享。  发表于 2021-4-21 17:31
发表于 2007-1-14 01:07 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2007-1-14 13:21 | 显示全部楼层
5楼写的程序不错,好用要顶下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-7 18:29 , Processed in 0.477180 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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