明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2167|回复: 10

[求助]程序完善

  [复制链接]
发表于 2010-7-26 09:25:00 | 显示全部楼层 |阅读模式
本程序为对象垂直对齐程序,不知道哪位大虾能完善一下增加一个对象水平对齐功能;
本程序来自网络,感谢原作者!

  1. ;;程序名称:对象水平垂直程序
  2. ;;执行命令:ahobj
  3. ;;程序功能:将选定的对象左对齐、右对齐或对中。
  4. ;;
  5. ;;
  6. (defun c:QD (/ selobjs oldcmdecho)
  7.   (setq oldcmdecho (getvar "cmdecho"))
  8.   (setvar "cmdecho" 0)
  9.   (setq selobjs (ssget))
  10.   (if (or (not selobjs) (= (sslength selobjs) 1))
  11.     (princ "\n你必须选定两个或两个以上的对象")
  12.     (process selobjs)
  13.   )
  14.   (setvar "cmdecho" oldcmdecho)
  15.   (princ)
  16. )
  17. (defun process (selobjs   /     amode     apnt apnt_x
  18.   apnt_y   count     objname   vlaxobj MinPoint
  19.   MaxPoint  minext   maxext   ext_l ext_r
  20.   ext_m   tpnt
  21.         )
  22.   (initget "L M R")
  23.   (setq amode (getkword
  24.   "\n选择对齐方式[左对齐(L)/对中(M)/右对齐(R)]<左对齐>:"
  25.        )
  26.   )
  27.   (if (not amode)
  28.     (setq amode "L")
  29.   )
  30.   (initget 1)
  31.   (setq apnt (getpoint "\n选择水平对齐方向的对齐点:"))
  32.   (setq apnt_x (car apnt)
  33. apnt_y (cadr apnt)
  34.   )
  35.   (vl-load-com)
  36.   (setq count 0)
  37.   (repeat (sslength selobjs)
  38.     (setq objname (ssname selobjs count))
  39.     (setq vlaxobj (vlax-ename->vla-object objname))
  40.     (setq MinPoint (vlax-make-variant))
  41.     (setq MaxPoint (vlax-make-variant))
  42.     (vla-GetBoundingBox vlaxobj 'MinPoint 'MaxPoint)
  43.     (setq minext (vlax-safearray->list MinPoint))
  44.     (setq maxext (vlax-safearray->list MaxPoint))
  45.     (setq ext_l (car minext))
  46.     (setq ext_r (car maxext))
  47.     (setq ext_m (+ (/ (abs (- ext_l ext_r)) 2) ext_l))
  48.     (cond
  49.       ((= amode "L")
  50.        (setq tpnt (list ext_l apnt_y))
  51.       )
  52.       ((= amode "M")
  53.        (setq tpnt (list ext_m apnt_y))
  54.       )
  55.       ((= amode "R")
  56.        (setq tpnt (list ext_r apnt_y))
  57.       )
  58.     )
  59.     (if tpnt
  60.       (command "_move" objname "" "non" tpnt "non" apnt)
  61.     )
  62.     (setq count (1+ count))
  63.   )
  64. )
  65. (defun c:XDTB_EntAlign (/ tf mat mats e box p lef rig cen mid ss v)
  66.   (if (setq p (getpoint "\n对齐点: "))
  67.     (progn
  68.       (initget "0 1 2 3 4")
  69.       (if (not (setq tf
  70.         (getkword
  71.    "\n请选择基点类型[0-左对齐 / 1-底对齐 / 2-右对齐 / 3-垂直居中 / 4-水平居中]<0>:"
  72.         )
  73.         )
  74.    )
  75. (setq tf "0")
  76.       )
  77.       (initget 6)
  78.       (setq mat (xdrx_matrix_identity 3))
  79.       (while (and
  80.         (progn
  81.    (prompt "\r请选取要对齐的实体<结束>:")
  82.    t
  83.         )
  84.         (setq ss (ssget))
  85.       )
  86. (xdrx_begin)
  87. (xdrx_ucson)
  88. (xdrx_setsstodb ss 0)
  89. (while (setq e (xdrx_getentdata 0))
  90.    (setq box  (xdrx_entity_box e)
  91.   lef  (car box)
  92.   mid  (xdrx_midp (car box) (cadr box))
  93.   rig  (cadr box)
  94.   cen  (xdrx_midp (car box) (caddr box))
  95.   v    (cond
  96.          ((= tf "0")
  97.    (list (- (car p) (car lef)) 0. 0.)
  98.          )
  99.          ((= tf "1")
  100.    (list 0. (- (cadr p) (cadr lef)) 0.)
  101.          )
  102.          ((= tf "2")
  103.    (list (- (car p) (car rig)) 0. 0.)
  104.          )
  105.          ((= tf "3")
  106.    (list (- (car p) (car mid)) 0. 0.)
  107.          )
  108.          (t
  109.    (list 0. (- (cadr p) (cadr cen)) 0.)
  110.          )
  111.        )
  112.   mats (xdrx_matrix_SetTranslation mat v)
  113.    )
  114.    (xdrx_entity_transform e mats)
  115. )
  116. (xdrx_ucsoff)
  117. (xdrx_end)
  118.       )
  119.     )
  120.   )
  121.   (princ)
  122. )
 楼主| 发表于 2010-7-26 09:26:00 | 显示全部楼层

把源程序附件传上来,希望有大虾和版主多多帮助!感谢!

本帖子中包含更多资源

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

x

点评

好使!  发表于 2013-6-7 12:25
 楼主| 发表于 2010-7-26 13:43:00 | 显示全部楼层
希望有大虾和版主多多帮助啊!
发表于 2010-7-27 11:09:00 | 显示全部楼层
  1. (defun c:QD (/ selobjs oldcmdecho)
  2. (setq oldcmdecho (getvar "cmdecho"))
  3. (setvar "cmdecho" 0)
  4. (setq selobjs (ssget))
  5. (if (or (not selobjs) (= (sslength selobjs) 1))
  6. (princ "\n你必须选定两个或两个以上的对象")
  7. (process selobjs)
  8. )
  9. (setvar "cmdecho" oldcmdecho)
  10. (princ)
  11. )
  12. (defun process (selobjs     /     amode apnt    apnt_x
  13.         apnt_y     count     objname vlaxobj    MinPoint
  14.         MaxPoint minext maxext ext_l    ext_r
  15.         ext_m     tpnt
  16.      )
  17. (initget "L M R T MT B")
  18. (setq    amode
  19.      (getkword
  20.      "\n选择对齐方式[左对齐(L)/对中(M)/右对齐(R)/上对齐(T)/中间(MT)/下对齐(B)]<左对齐>:"
  21.      )
  22. )
  23. (if (not amode)
  24. (setq amode "L")
  25. )
  26. (initget 1)
  27. (setq apnt (getpoint "\n选择对齐方向的对齐点:"))
  28. (setq    apnt_x (car apnt)
  29.     apnt_y (cadr apnt)
  30. )
  31. (vl-load-com)
  32. (setq count 0)
  33. (repeat (sslength selobjs)
  34. (setq objname (ssname selobjs count))
  35. (setq vlaxobj (vlax-ename->vla-object objname))
  36. (setq MinPoint (vlax-make-variant))
  37. (setq MaxPoint (vlax-make-variant))
  38. (vla-GetBoundingBox vlaxobj 'MinPoint 'MaxPoint)
  39. (setq minext (vlax-safearray->list MinPoint))
  40. (setq maxext (vlax-safearray->list MaxPoint))
  41. (setq ext_l (car minext))
  42. (setq ext_r (car maxext))
  43. (setq ext_m (+ (/ (abs (- ext_l ext_r)) 2) ext_l))
  44. (setq ext_t (cadr maxext))
  45. (setq ext_b (cadr minext))
  46. (setq ext_mt (+ (/ (abs (- ext_t ext_b)) 2) ext_b))
  47. (cond
  48. ((= amode "L")
  49. (setq tpnt (list ext_l apnt_y))
  50. )
  51. ((= amode "M")
  52. (setq tpnt (list ext_m apnt_y))
  53. )
  54. ((= amode "R")
  55. (setq tpnt (list ext_r apnt_y))
  56. )
  57. ((= amode "T")
  58. (SETQ tpnt (list apntx ext_t))
  59. )
  60. ((= amode "MT")
  61. (setq tpnt (list apnt_x ext_mt))
  62. )
  63. ((= amode "B")
  64. (setq tpnt (list apnt_x ext_b))
  65. )
  66. )
  67. (if    tpnt
  68. (command "_move" objname "" tpnt apnt)
  69. )
  70. (setq count (1+ count))
  71. )
  72. )
发表于 2010-7-27 11:29:00 | 显示全部楼层

(defun c:zd1()
 (setvar "CMDECHO" 0)
(setq sel1 (ssget))
(setq l1 (entsel "\n 选择直线:"))
(setq d (entget (car l1)))
(setq P1 (cdr (assoc 10 d)))
(setq P2 (cdr (assoc 11 d)))
(setq d1 (car p1))
(setq d2 (cadr p1))
(setq d3 (car p2))
(setq d4 (cadr p2))
(setq pt (cadr l1))
(setq mm (osnap pt "mid"))
(if(> d2 d4)
(command "rotate" sel1 "" mm "r" p2 p1 90 "")
(command "rotate" sel1 "" mm "r" p1 p2 90 "")
)
(princ)
)

 

 

有点简陋!只有左边摆正,选线就可以了
 楼主| 发表于 2010-7-27 20:11:00 | 显示全部楼层

4楼这个程序好像上对齐不好用会出现如下(操作对象单行文本或者多行文本):

   选择对齐方式[左对齐(L)/对中(M)/右对齐(R)/上对齐(T)/中间(MT)/下对齐(B)]<左对齐>:T
   选择对齐方向的对齐点:
   窗口说明无效。
   ; 错误: 函数被取消
   命令: 指定对角点:

 

 

不过还是感谢

发表于 2010-7-27 21:35:00 | 显示全部楼层
  1. ;;程序名称:对象水平垂直程序
  2. ;;执行命令:ahobj
  3. ;;程序功能:将选定的对象左对齐、右对齐或对中。
  4. ;;
  5. ;;
  6. (defun c:QD (/ selobjs oldcmdecho)
  7. (setq oldcmdecho (getvar "cmdecho"))
  8. (setvar "cmdecho" 0)
  9. (setq selobjs (ssget))
  10. (if (or (not selobjs) (= (sslength selobjs) 1))
  11. (princ "\n你必须选定两个或两个以上的对象")
  12. (process selobjs)
  13. )
  14. (setvar "cmdecho" oldcmdecho)
  15. (princ)
  16. )
  17. (defun process (selobjs     /     amode apnt    apnt_x
  18.         apnt_y     count     objname vlaxobj    MinPoint
  19.         MaxPoint minext maxext ext_l    ext_r
  20.         ext_m     tpnt
  21.      )
  22. (initget "L M R T MT B")
  23. (setq    amode
  24.      (getkword
  25.      "\n选择对齐方式[左对齐(L)/对中(M)/右对齐(R)/上对齐(T)/中间(MT)/下对齐(B)]<左对齐>:"
  26.      )
  27. )
  28. (if (not amode)
  29. (setq amode "L")
  30. )
  31. (initget 1)
  32. (setq apnt (getpoint "\n选择对齐方向的对齐点:"))
  33. (setq    apnt_x (car apnt)
  34.     apnt_y (cadr apnt)
  35. )
  36. (vl-load-com)
  37. (setq count 0)
  38. (repeat (sslength selobjs)
  39. (setq objname (ssname selobjs count))
  40. (setq vlaxobj (vlax-ename->vla-object objname))
  41. (setq MinPoint (vlax-make-variant))
  42. (setq MaxPoint (vlax-make-variant))
  43. (vla-GetBoundingBox vlaxobj 'MinPoint 'MaxPoint)
  44. (setq minext (vlax-safearray->list MinPoint))
  45. (setq maxext (vlax-safearray->list MaxPoint))
  46. (setq ext_l (car minext))
  47. (setq ext_r (car maxext))
  48. (setq ext_m (+ (/ (abs (- ext_l ext_r)) 2) ext_l))
  49. (setq ext_t (cadr maxext))
  50. (setq ext_b (cadr minext))
  51. (setq ext_mt (+ (/ (abs (- ext_t ext_b)) 2) ext_b))
  52. (cond
  53. ((= amode "L")
  54. (setq tpnt (list ext_l apnt_y))
  55. )
  56. ((= amode "M")
  57. (setq tpnt (list ext_m apnt_y))
  58. )
  59. ((= amode "R")
  60. (setq tpnt (list ext_r apnt_y))
  61. )
  62. ((= amode "T")
  63. (SETQ tpnt (list apnt_x ext_t))
  64. )
  65. ((= amode "MT")
  66. (setq tpnt (list apnt_x ext_mt))
  67. )
  68. ((= amode "B")
  69. (setq tpnt (list apnt_x ext_b))
  70. )
  71. )
  72. (print tpnt)
  73. (if    tpnt
  74. (command "_move" objname "" tpnt apnt)
  75. )
  76. (setq count (1+ count))
  77. )
  78. )



有一个变量写错了 已改正
 楼主| 发表于 2010-7-28 08:27:00 | 显示全部楼层

试验过了可以用了,不过还有一个小小问题,就是在对块上对齐的时候,会对不齐,见图:

本帖子中包含更多资源

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

x
发表于 2010-7-28 09:04:00 | 显示全部楼层

我测试过 可以对齐的 应该是你捕捉没关

在程序里加两句把捕捉关掉你试试

在程序最前边加

(setq os (getvar "osmode"))

(setvar "osmode" 0)

 

在程序结尾的地方加上

(setvar "osmode" os)

 楼主| 发表于 2010-7-28 12:12:00 | 显示全部楼层

捕捉关了,可以对齐了,但是有时候需要捕捉对齐点,或者文本时以第一个文本插入点作为参照就有点,

就有点不是特别好了,不过还是感谢!

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

本版积分规则

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

GMT+8, 2024-10-2 08:31 , Processed in 0.182479 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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