明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: hhaoma

[已解答] 帮忙解决下由两个方形组成的图形,点击内部列出计算公式

[复制链接]
 楼主| 发表于 2014-8-28 18:23:50 | 显示全部楼层
Atsai 发表于 2014-8-28 16:55
功能类似是这样的吧, 目前只能改到这样!

高手啊!求代码~
回复

使用道具 举报

 楼主| 发表于 2014-8-28 18:24:47 | 显示全部楼层
Atsai 你真厉害啊!有代码不?能教教我吗?
回复

使用道具 举报

发表于 2014-8-28 21:57:03 | 显示全部楼层
我是利用下面的源码改的!
有点长,如果看得懂,应该就有办法改。
  1. ;-------------------------------------------------------------------------------
  2. ; Program Name: DPL - Dimension Polylines
  3. ; Created By:   Terry Miller (Email: terrycadd@yahoo.com)
  4. ;               (URL: http://web2.airmail.net/terrycad)
  5. ; Date Created: 5-20-08
  6. ; Function:     Dimensions Polyline shapes
  7. ;-------------------------------------------------------------------------------
  8. ; Revision History
  9. ; Rev  By     Date    Description
  10. ;-------------------------------------------------------------------------------
  11. ; 1    TM   5-20-08   Initial version
  12. ;-------------------------------------------------------------------------------
  13. ; c:DPL - Dimensions Polyline
  14. ;-------------------------------------------------------------------------------
  15. (defun c:DPL (/ EntName^ EntPick@)
  16.   (setvar "CMDECHO" 0)
  17.   (if (setq EntPick@ (entsel "\nSelect Polyline to dimension: "))
  18.     (if (= (cdr (assoc 0 (entget (car EntPick@)))) "LWPOLYLINE")
  19.       (progn
  20.         (setq EntName^ (cdr (assoc -1 (entget (car EntPick@)))))
  21.         (DimPL EntName^)
  22.       );progn
  23.     );if
  24.   );if
  25.   (if (not EntName^)
  26.     (princ "\nNo Polyline selected.")
  27.   );if
  28.   (princ)
  29. );defun c:DPL
  30. ;-------------------------------------------------------------------------------
  31. ; DimPL - Function to dimension Polyline
  32. ; Arguments: 1
  33. ;   EntName^ = Polyline entity name
  34. ; Returns: Dimensions Polyline
  35. ;-------------------------------------------------------------------------------
  36. (defun DimPL (EntName^ / Bottom@ Clayer$ CW# DiffAng DimPts: DimSpace~ EntList@
  37.   Item LastAng~ LastPt Left@ List@ NW@ Osmode# P0 P1 P2 Pt Pts@ PtsLen Right@ SE@
  38.   Top@ X~ X1~ X1Y1 X1Y2 X1Ys@ X2~ X2Y1 X2Y2 X2Ys@ XPts@ Y~ Y1~ Y1X1 Y1X2 Y1Xs@ Y2~
  39.   Y2X1 Y2X2 Y2Xs@ YPts@)
  40.   ;-----------------------------------------------------------------------------
  41.   (defun DimPts: (Pts@ StartPt EndPt Type$ / Add Num1~ Num2~ Nums1@ Nums2@ P1 P2
  42.     Pt Return@)
  43.     (setq Add t)
  44.     (foreach Pt (member StartPt (append Pts@ Pts@))
  45.       (if Add
  46.         (setq Return@ (append Return@ (list Pt)))
  47.       );if
  48.       (if (equal Pt EndPt)
  49.         (setq Add nil)
  50.       );if
  51.     );foreach
  52.     (foreach Pt Return@
  53.       (if (member Type$ (list "Left" "Right"))
  54.         (setq Nums1@ (append Nums1@ (list (cadr Pt))))
  55.         (setq Nums1@ (append Nums1@ (list (car Pt))))
  56.       );if
  57.     );foreach
  58.     (foreach Num1~ (vl-sort Nums1@ '<)
  59.       (setq Nums2@ nil)
  60.       (foreach Pt Return@
  61.         (if (member Type$ (list "Left" "Right"))
  62.           (if (= (cadr Pt) Num1~)
  63.             (setq Nums2@ (append Nums2@ (list (car Pt))))
  64.           );if
  65.           (if (= (car Pt) Num1~)
  66.             (setq Nums2@ (append Nums2@ (list (cadr Pt))))
  67.           );if
  68.         );if
  69.       );foreach
  70.       (if (member Type$ (list "Left" "Bottom"))
  71.         (setq Nums2@ (vl-sort Nums2@ '<))
  72.         (setq Nums2@ (reverse (vl-sort Nums2@ '<)))
  73.       );if
  74.       (foreach Num2~ (cdr Nums2@)
  75.         (if (member Type$ (list "Left" "Right"))
  76.           (setq Pt (list Num2~ Num1~))
  77.           (setq Pt (list Num1~ Num2~))
  78.         );if
  79.         (setq Return@ (vl-remove Pt Return@))
  80.       );foreach
  81.     );foreach
  82.     (cond
  83.       ((= Type$ "Left")
  84.         (vl-sort Return@ (function (lambda (P1 P2)(< (cadr P1)(cadr P2)))))
  85.       );case
  86.       ((= Type$ "Top")
  87.         (vl-sort Return@ (function (lambda (P1 P2)(< (car P1)(car P2)))))
  88.       );case
  89.       ((= Type$ "Right")
  90.         (vl-sort Return@ (function (lambda (P1 P2)(> (cadr P1)(cadr P2)))))
  91.       );case
  92.       ((= Type$ "Bottom")
  93.         (vl-sort Return@ (function (lambda (P1 P2)(> (car P1)(car P2)))))
  94.       );case
  95.     );cond
  96.   );defun DimPts:
  97.   ;-----------------------------------------------------------------------------
  98.   (setq EntList@ (entget EntName^))
  99.   (if (= (cdr (assoc 0 EntList@)) "LWPOLYLINE")
  100.     (progn
  101.       (foreach List@ EntList@
  102.         (if (= (car List@) 10)
  103.           (if (not (equal (cdr List@) LastPt))
  104.             (progn
  105.               (setq Pts@ (append Pts@ (list (cdr List@))))
  106.               (if (> (length Pts@) 2)
  107.                 (if (/= (angle LastPt (cdr List@)) LastAng~) (setq DiffAng t))
  108.               );if
  109.               (if (> (length Pts@) 1)
  110.                 (setq LastAng~ (angle LastPt (cdr List@)))
  111.               );if
  112.               (setq LastPt (cdr List@))
  113.             );progn
  114.           );if
  115.         );if
  116.       );foreach
  117.       (if (equal (car Pts@) (last Pts@))
  118.         (setq Pts@ (reverse (cdr (reverse Pts@))))
  119.       );if
  120.       (setq PtsLen (length Pts@))
  121.     );progn
  122.     (exit)
  123.   );if
  124.   (foreach Pt Pts@
  125.     (setq X~ (atof (rtos (car Pt) 2 8))
  126.           Y~ (atof (rtos (cadr Pt) 2 8))
  127.           XPts@ (append XPts@ (list X~))
  128.           YPts@ (append YPts@ (list Y~))
  129.           Pts@ (cdr (append Pts@ (list (list X~ Y~))))
  130.     );setq
  131.   );foreach
  132.   (setq XPts@ (vl-sort XPts@ '<)
  133.         YPts@ (vl-sort YPts@ '<)
  134.         X1~ (car XPts@)
  135.         X2~ (last XPts@)
  136.         Y1~ (car YPts@)
  137.         Y2~ (last YPts@)
  138.   );if
  139.   (foreach Pt Pts@
  140.     (if (= (car Pt) X1~) (setq X1Ys@ (append X1Ys@ (list (cadr Pt)))))
  141.     (if (= (car Pt) X2~) (setq X2Ys@ (append X2Ys@ (list (cadr Pt)))))
  142.     (if (= (cadr Pt) Y1~) (setq Y1Xs@ (append Y1Xs@ (list (car Pt)))))
  143.     (if (= (cadr Pt) Y2~) (setq Y2Xs@ (append Y2Xs@ (list (car Pt)))))
  144.   );foreach
  145.   (setq X1Ys@ (vl-sort X1Ys@ '<)
  146.         X2Ys@ (vl-sort X2Ys@ '<)
  147.         Y1Xs@ (vl-sort Y1Xs@ '<)
  148.         Y2Xs@ (vl-sort Y2Xs@ '<)
  149.         X1Y1 (list X1~ (car X1Ys@))
  150.         X1Y2 (list X1~ (last X1Ys@))
  151.         X2Y1 (list X2~ (car X2Ys@))
  152.         X2Y2 (list X2~ (last X2Ys@))
  153.         Y1X1 (list (car Y1Xs@) Y1~)
  154.         Y1X2 (list (last Y1Xs@) Y1~)
  155.         Y2X1 (list (car Y2Xs@) Y2~)
  156.         Y2X2 (list (last Y2Xs@) Y2~)
  157.         Pts@ (member X1Y1 (append Pts@ Pts@))
  158.   );setq
  159.   (while (> (length Pts@) PtsLen)
  160.     (setq Pts@ (reverse (cdr (reverse Pts@))))
  161.   );while
  162.   (setq SE@ (member X2Y2 Pts@) NW@ Pts@)
  163.   (foreach Item SE@
  164.     (setq NW@ (vl-remove Item NW@))
  165.   );foreach
  166.   (setq SE@ (append SE@ (list X1Y1))
  167.         NW@ (append NW@ (list X2Y2))
  168.         CW# 0
  169.   );setq
  170.   (foreach Pt (list Y2X1 Y2X2)
  171.     (if (member Pt NW@) (setq CW# (1+ CW#)))
  172.     (if (member Pt SE@) (setq CW# (1- CW#)))
  173.   );foreach
  174.   (foreach Pt (list Y1X1 Y1X2)
  175.     (if (member Pt SE@) (setq CW# (1+ CW#)))
  176.     (if (member Pt NW@) (setq CW# (1- CW#)))
  177.   );foreach
  178.   (if (< CW# 0)
  179.     (setq Pts@ (append (list (car Pts@))(reverse (cdr Pts@))))
  180.   );if
  181.   (setq Left@ (DimPts: Pts@ Y1X1 Y2X1 "Left"))
  182.   (setq Top@ (DimPts: Pts@ X1Y2 X2Y2 "Top"))
  183.   (setq Right@ (DimPts: Pts@ Y2X2 Y1X2 "Right"))
  184.   (setq Bottom@ (DimPts: Pts@ X2Y1 X1Y1 "Bottom"))
  185.   ;-----------------------------------------------------------------------------
  186.   (command "UNDO" "BEGIN")
  187.   (setq DimSpace~ (* (getvar "DIMSCALE") (getvar "DIMTXT") 3))
  188.   (setq Osmode# (getvar "OSMODE")) (setvar "OSMODE" 0)
  189.   (setq Clayer$ (getvar "CLAYER"))
  190.   (command "LAYER" "S" (GetDimLayer) "");<--Change to your Dim layer info
  191.   (setq P0 (polar X1Y1 pi (* DimSpace~ 1.5))
  192.         P1 (car Left@)
  193.   );setq
  194.   (foreach P2 (cdr Left@)
  195.     (command "DIM1" "VER" P1 P2 P0 "")
  196.     (setq P1 P2)
  197.   );foreach
  198.   (if (> (length Left@) 2)
  199.     (progn
  200.       (setq P0 (polar P0 pi DimSpace~))
  201.       (command "DIM1" "VER" (car Left@) (last Left@) P0 "")
  202.     );progn
  203.   );if
  204.   (setq P0 (polar Y2X1 (* pi 0.5) (* DimSpace~ 1.5))
  205.         P1 (car Top@)
  206.   );setq
  207.   (foreach P2 (cdr Top@)
  208.     (command "DIM1" "HOR" P1 P2 P0 "")
  209.     (setq P1 P2)
  210.   );foreach
  211.   (if (> (length Top@) 2)
  212.     (progn
  213.       (setq P0 (polar P0 (* pi 0.5) DimSpace~))
  214.       (command "DIM1" "HOR" (car Top@) (last Top@) P0 "")
  215.     );progn
  216.   );if
  217.   (setq P0 (polar X2Y2 0 (* DimSpace~ 1.5))
  218.         P1 (car Right@)
  219.   );setq
  220.   (if (and (> (length Right@) 2) DiffAng)
  221.     (foreach P2 (cdr Right@)
  222.       (command "DIM1" "VER" P1 P2 P0 "")
  223.       (setq P1 P2)
  224.     );foreach
  225.   );if
  226.   (setq P0 (polar Y1X2 (* pi 1.5) (* DimSpace~ 1.5))
  227.         P1 (car Bottom@)
  228.   );setq
  229.   (if (and (> (length Bottom@) 2) DiffAng)
  230.     (foreach P2 (cdr Bottom@)
  231.       (command "DIM1" "HOR" P1 P2 P0 "")
  232.       (setq P1 P2)
  233.     );foreach
  234.   );if
  235.   (setvar "CLAYER" Clayer$)
  236.   (setvar "OSMODE" Osmode#)
  237.   (command "UNDO" "END")
  238.   (princ)
  239. );defun DimPL
  240. ;-------------------------------------------------------------------------------
  241. ; GetDimLayer - Returns the layer name that's on and has the most dimensions,
  242. ; or the current layer name if there's no dimensions.
  243. ;-------------------------------------------------------------------------------
  244. (defun GetDimLayer (/ DimLayer$ EntList@ Index# Layer$ LayerInfo@ LayerList@ List@ Num# SS&)
  245.   (setq Layer$ (getvar "CLAYER"))
  246.   (if (setq SS& (ssget "X" '((0 . "DIMENSION"))))
  247.     (progn
  248.       (setq Index# -1)
  249.       (while (< (setq Index# (1+ Index#)) (sslength SS&))
  250.         (setq EntList@ (entget (ssname SS& Index#))
  251.               DimLayer$ (cdr (assoc 8 EntList@))
  252.               LayerInfo@ (tblsearch "LAYER" DimLayer$)
  253.         );setq
  254.         (if (and (= (cdr (assoc 70 LayerInfo@)) 0)(> (cdr (assoc 62 LayerInfo@)) 0))
  255.           (if (assoc DimLayer$ LayerList@)
  256.             (setq Num# (1+ (cdr (assoc DimLayer$ LayerList@)))
  257.                   LayerList@ (subst (cons DimLayer$ Num#) (assoc DimLayer$ LayerList@) LayerList@)
  258.             );setq
  259.             (setq LayerList@ (append LayerList@ (list (cons DimLayer$ 1))))
  260.           );if
  261.         );if
  262.       );while
  263.       (if LayerList@
  264.         (progn
  265.           (setq Layer$ (car (car LayerList@))
  266.                 Num# (cdr (car LayerList@))
  267.           );setq
  268.           (foreach List@ (cdr LayerList@)
  269.             (if (> (cdr List@) Num#)
  270.               (setq Layer$ (car List@)
  271.                     Num# (cdr List@)
  272.               );setq
  273.             );if
  274.           );foreach
  275.         );progn
  276.       );if
  277.     );progn
  278.   );if
  279.   Layer$
  280. );defun GetDimLayer
  281. ;-------------------------------------------------------------------------------
  282. (princ);End of DPL.lsp
回复

使用道具 举报

 楼主| 发表于 2014-8-29 06:26:44 | 显示全部楼层
Atsai 发表于 2014-8-28 21:57
我是利用下面的源码改的!
有点长,如果看得懂,应该就有办法改。

你可以把改好的 发上来吗?谢谢啊
回复

使用道具 举报

 楼主| 发表于 2014-8-29 06:27:25 | 显示全部楼层
Atsai 发表于 2014-8-28 21:57
我是利用下面的源码改的!
有点长,如果看得懂,应该就有办法改。

你可以把改好的 发上来吗?谢谢啊
回复

使用道具 举报

 楼主| 发表于 2014-8-29 18:41:28 | 显示全部楼层
本帖最后由 hhaoma 于 2014-8-29 18:43 编辑
Atsai 发表于 2014-8-29 15:07
指令:adbmz

我的是加号 你的是减号  不符合要求。而且你标注的距离也不符合我的要求。
希望可以再改改
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 09:33 , Processed in 0.151005 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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