明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2967|回复: 7

麻烦龙兄帮我改进一下这个中心线自动标注程序

[复制链接]
发表于 2004-12-23 21:08:00 | 显示全部楼层 |阅读模式
以下程序如果能达到这一点就完美了:当出现"请输入中心线长度:"的提示的时候,鼠标变成十字,可以任意点两点作为中心线长度就好了,原程序如下: ;|
zxx.lsp 中心点-中心线
* C:zxx
-- XYP@bsedi.com
2004.12.14
2004.12.15 增加中心线长度控制
2004.12.17, 22:08:32 增加注释,公布源码
2004.12.23 强制画线,增加回退控制
|;
;;;加载zxx.lsp,运行zxx。
(prompt "\n\r 加载中心点程序。")
;;;-------------------------------------------
;;;主程序
(defun c:zxx ()
(vl-load-com) ;将 Visual LISP 扩展功能加载到 AutoLISP
(cmdla0) ;保存用户设置
(setq ;;txt5 (ukword 1 "1 2" "\n请选择形式:1-显示/2-绘制" txt5)
;;格式化关键字输入
LL (ureal 1 "" "\n中心线长度" ll) ;格式化实型数键盘输入
txt5 "2" ;强制画线
)
(command "undo" "BE") ;回退开始
(while (setq pt1 (getpoint "\n\t选择区域内一点<退出> : "))
(command "-boundary" "a" "o" "r" "" pt1 "") ;建立面域
(progn
(setq
;;(vlax-safearray->list var) 以表的形式返回 SafeArray 中的元素
;;(vlax-variant-value var) 返回变体的值
;;(vla-get-Centroid Object) 取得面域或实体的面积或质量的中点
;;(vlax-ename->vla-object entname) 将 AutoLISP 类型的对象名转换为 VLA 对象
pt1
(vlax-safearray->list
(vlax-variant-value
(vla-get-centroid (vlax-ename->vla-object (entlast)))
)
)
)
(entdel (entlast)) ;删除面域
(if (= txt5 "1")
(progn
(grvecs (list 1 (POLAR PT1 0 ll) (POLAR PT1 PI ll)))
;在屏幕上绘出多重向量,长度用户控制
(grvecs
(list 1 (POLAR PT1 (/ PI 2) ll) (POLAR PT1 (* PI 1.5) ll))
)
)
)
(if (= txt5 "2")
(progn
(setvar "osmode" 0) ;取消捕捉
(mkla "中心线" 1) ;建层,取消此句可以随层
(command "line" (POLAR PT1 0 ll) (POLAR PT1 PI ll) "")
(command "line"
(POLAR PT1 (/ PI 2) ll)
(POLAR PT1 (* PI 1.5) ll)
""
)
(redraw) ;刷新屏幕
)
)
)
)
(command "undo" "E") ;回退结束
(cmdla1) ;恢复用户设置
)
;;;-------------------------------------------
;;;通用子程序
(defun CMDLA0 ()
(setq cmdech (getvar "CMDECHO"))
(setq oom (getvar "orthomode"))
(setq osm (getvar "osmode"))
(SETQ LA (getvar "clayer"))
(setq rmode (getvar "regenmode"))
(setq pw (getvar "plinewid"))
(setvar "regenmode" 0)
(setvar "CMDECHO" 0)
(princ)
)
(defun CMDLA1 ()
(setvar "CMDECHO" cmdech)
(setvar "orthomode" oom)
(setvar "osmode" osm)
(setvar "clayer" LA)
(setvar "regenmode" rmode)
(setvar "plinewid" pw)
(princ)
)
(defun ureal (bit kwd msg def / inp)
(if def
(setq msg (strcat "\n" msg "<" (rtos def 2) ">: ")
bit (* 2 (fix (/ bit 2)))
)
(setq msg (strcat "\n" msg ": "))
)
(initget bit kwd)
(setq inp (getreal msg))
(if inp
inp
def
)
)
(defun mkla (name color)
(If (= (Tblsearch "layer" name) nil)
(Command "layer" "m" name "c" color name "")
(Command "layer" "t" name "s" name "c" color name "")
)
)
(defun ukword (bit kwd msg def / inp)
(if (and def (/= def ""))
(setq msg (strcat "\n" msg "<" def ">:")
bit (* 2 (fix (/ bit 2)))
)
(setq msg (strcat "\n" msg ":"))
)
(initget bit kwd)
(setq inp (getkword msg))
(if inp
inp
def
)
)
(DEFUN PXYP (TXT1)
(SETQ TXT1 (STRCAT "\n\r 程序命令: "
TXT1
" -- xyp@bsedi.com"
)
)
(PRINC TXT1)
(Princ)
)
(pxyp "ZXX (中心线)") ;加载时显示调用本程序的命令
(princ)
;;;-------------------------------------------
;;;END
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2004-12-23 23:13:00 | 显示全部楼层
可用getdist 输入数值或取二点得距离值
发表于 2004-12-24 08:49:00 | 显示全部楼层
贱人发表于2004-12-23 21:08:00回复:(贱人)麻烦龙兄帮我改进一下这个中心线自动标注程序 以下程序如果能达到这一点就完美了:当出现\"请输入中心线长度:\"的提示的时候,鼠标变成十字,可以任意点两点作为中心...

为甚么不直接要求原作者改进 ;;方法: ;;找出面域boundingbox,再画出十字(中心十字有长短),再用scale拖动缩放
发表于 2005-1-7 16:00:00 | 显示全部楼层
  1. ;;找出面域boundingbox,再画出十字(中心十字有长短),再用scale拖动缩放zxx.lsp 中心点-中心线
  2. * C:zxx
  3. -- XYP@bsedi.com
  4. 2004.12.14
  5. 2004.12.15 增加中心线长度控制
  6. 2004.12.17, 22:08:32 增加注释,公佈源码
  7. 2004.12.23 强制画线,增加回退控制
  8. |;
  9. ;;;载入zxx.lsp,运行zxx。
  10. (prompt "\n\r           载入中心点程式。")
  11. ;;;-------------------------------------------
  12. ;;;主程序
  13. (defun C:ZXX
  14.              (/ DX DY EN1 LL LST PT1 TXT5 UR CMDECH LA OOM OSM PW RMODE)
  15.    (vl-load-com)        ;将 Visual LISP 扩展功能载入到 AutoLISP
  16.    (CMDLA0)        ;保存用户设置
  17.    (setq  ;;txt5 (ukword 1 "1 2" "\n请选择形式:1-显示/2-绘製" txt5)
  18.   ;;格式化关键字输入
  19.   ;;LL     (UREAL 1 "" "\n中心线长度" LL) ;格式化实型数键盘输入
  20.   TXT5 "2"        ;强制画线
  21.    )
  22.    (command "undo" "BE")      ;回退开始
  23.    (while (setq PT1 (getpoint "\n\t选择区域内一点<退出> : "))
  24.        (command "-boundary" "a" "o" "r" "" PT1 "") ;建立面域
  25.        (progn
  26.            (setq
  27.   ;;(vlax-safearray->list var) 以表的形式返回 SafeArray 中的元素
  28.   ;;(vlax-variant-value var) 返回变体的值
  29.   ;;(vla-get-Centroid Object) 取得面域或实体的面积或质量的中点
  30.   ;;(vlax-ename->vla-object entname) 将 AutoLISP 类型的物件名转换为 VLA 物件
  31.   PT1
  32.    (vlax-safearray->list
  33.        (vlax-variant-value
  34.            (vla-get-centroid (vlax-ename->vla-object (entlast)))
  35.        )
  36.    )
  37.            )
  38.            (vla-getboundingbox
  39.   (vlax-ename->vla-object (entlast))
  40.   'LL
  41.   'UR
  42.            )
  43.            (setq LST  (mapcar 'vlax-safearray->list (list LL UR))
  44.          DX  (* 0.01 (- (caadr LST) (caar LST)))
  45.          DY  (* 0.01 (- (cadadr LST) (cadar LST)))
  46.            )
  47.            (entdel (entlast))    ;删除面域
  48.            ;|(if (= TXT5 "1")
  49.   (progn
  50.      (grvecs (list 1 (polar PT1 0 LL) (polar PT1 pi LL)))
  51.           ;在萤幕上绘出多重向量,长度用户控制
  52.      (grvecs
  53.          (list 1 (polar PT1 (/ pi 2) LL) (polar PT1 (* pi 1.5) LL))
  54.      )
  55.   )
  56.            )|;
  57.            (if (= TXT5 "2")
  58.   (progn
  59.      (setvar "osmode" 0)    ;取消捕捉
  60.      (MKLA "中心线" 1)    ;建层,取消此句可以随层
  61.      (command "line"
  62.          (polar PT1 0 DX)
  63.          (polar PT1 pi DX)
  64.          ""
  65.      )
  66.      (setq EN1 (entlast))
  67.      (command "line"
  68.          (polar PT1 (/ pi 2) DY)
  69.          (polar PT1 (* pi 1.5) DY)
  70.          ""
  71.      )
  72.      (command "_.scale" (entlast) EN1 "" PT1 PAUSE)
  73.      (redraw)      ;刷新萤幕
  74.   )
  75.            )
  76.        )
  77.    )
  78.    (command "undo" "E")      ;回退结束
  79.    (CMDLA1)        ;恢復用户设置
  80. )
  81. ;;;-------------------------------------------
  82. ;;;通用副程式
  83. (defun CMDLA0 ()
  84.    (setq CMDECH (getvar "CMDECHO"))
  85.    (setq OOM (getvar "orthomode"))
  86.    (setq OSM (getvar "osmode"))
  87.    (setq LA (getvar "clayer"))
  88.    (setq RMODE (getvar "regenmode"))
  89.    (setq PW (getvar "plinewid"))
  90.    (setvar "regenmode" 0)
  91.    (setvar "CMDECHO" 0)
  92.    (princ)
  93. )
  94. (defun CMDLA1 ()
  95.    (setvar "CMDECHO" CMDECH)
  96.    (setvar "orthomode" OOM)
  97.    (setvar "osmode" OSM)
  98.    (setvar "clayer" LA)
  99.    (setvar "regenmode" RMODE)
  100.    (setvar "plinewid" PW)
  101.    (princ)
  102. )
  103. (defun UREAL (BIT KWD MSG DEF / INP)
  104.    (if DEF
  105.        (setq MSG (strcat "\n" MSG "<" (rtos DEF 2) ">: ")
  106.      BIT (* 2 (fix (/ BIT 2)))
  107.        )
  108.        (setq MSG (strcat "\n" MSG ": "))
  109.    )
  110.    (initget BIT KWD)
  111.    (setq INP (getreal MSG))
  112.    (if INP
  113.        INP
  114.        DEF
  115.    )
  116. )
  117. (defun MKLA (NAME COLOR)
  118.    (if (= (tblsearch "layer" NAME) NIL)
  119.        (command "layer" "m" NAME "c" COLOR NAME "")
  120.        (command "layer" "t" NAME "s" NAME "c" COLOR NAME "")
  121.    )
  122. )
  123. (defun UKWORD (BIT KWD MSG DEF / INP)
  124.    (if (and DEF (/= DEF ""))
  125.        (setq MSG (strcat "\n" MSG "<" DEF ">:")
  126.      BIT (* 2 (fix (/ BIT 2)))
  127.        )
  128.        (setq MSG (strcat "\n" MSG ":"))
  129.    )
  130.    (initget BIT KWD)
  131.    (setq INP (getkword MSG))
  132.    (if INP
  133.        INP
  134.        DEF
  135.    )
  136. )
  137. (defun PXYP (TXT1)
  138.    (setq  TXT1 (strcat "\n\r           程式命令: "
  139.              TXT1
  140.              "           -- xyp@bsedi.com"
  141.            )
  142.    )
  143.    (princ TXT1)
  144.    (princ)
  145. )
  146. (PXYP "ZXX           (中心线)")    ;载入时显示调用本程式的命令
  147. (princ)
  148. ;;;-------------------------------------------
  149. ;;;END
 楼主| 发表于 2005-1-30 00:15:00 | 显示全部楼层
龙兄,强的,比我想的还要好用,鲜花
 楼主| 发表于 2005-4-30 16:50:00 | 显示全部楼层
能再改一下吗,把画的中心线不要放到“中心线”层,颜色也不要自动改成红色,就放到当前层,颜色就按当前层的颜色
发表于 2005-4-30 20:33:00 | 显示全部楼层
龙龙仔,yehh!~~~~
发表于 2005-5-1 22:52:00 | 显示全部楼层
  1. (load "xyp_lib")
  2.   ;|
  3. 加载通用函数
  4. 如果已经下载xyp_lib并放到搜索路径下可以不再下载!
  5. 下载地址:http://www.xdcad.net/forum/showthread.php?s=&threadid=325268
  6. 如果已在acad.lsp中添加了(load "xyp_lib"),可以直接运行下面的程序。
  7. |;
  8. (defun c:zxx (/ pt1)
  9.    (cmdla0)
  10.    (setq LL (ureal 1 "" "\n中心线长度" ll))
  11.    (while (setq pt1 (getpoint "\n选择区域内一点<退出> : "))
  12.        (command "-boundary" "a" "o" "r" "" pt1 "")
  13.        (setq pt1 (vlax-safearray->list
  14.            (vlax-variant-value
  15.                (vla-get-centroid (vlax-ename->vla-object (entlast)))
  16.            )))
  17.        (entdel (entlast))
  18.        (setvar "osmode" 0)
  19.        (command "line" (POLAR PT1 0 ll) (POLAR PT1 PI ll) "")
  20.        (command "line"(POLAR PT1 (/ PI 2) ll)
  21.            (POLAR PT1 (* PI 1.5) ll) ""
  22.        ))
  23.    (cmdla1)
  24. )
  25. (pxyp "ZXX (中心线)")
  26. (princ)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-17 04:36 , Processed in 0.178549 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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