找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1215|回复: 3

[LISP程序]:新年献礼 王婆卖瓜 我新写的地形图注记程序

[复制链接]
发表于 2008-1-9 03:46:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×

  1.   [FONT=courier new]
  2. ;;;工作中,往地形图上注记汉字时,要求不同类别有不同的字高和层次
  3. ;;;虽然有一些编制好的程序,但实际使用时不是很方便,不足之处主要
  4. ;;;表现在:注记的内容不能自动分层,
  5. ;;;大小不能依据比例尺自行调整
  6. ;;;常用的注记全部是写在程序中,不能够方便的进行增/删操作,
  7. ;;;每到一个新测区,若是有不一样的分层要求,要修改源程序,很不方便
  8. ;;;所以编写了这么一个小程序,使得用户可能通过维护一个文本文件:
  9. ;;;"注记分类.txt"来实现注记文本的选取/自动分层/调整大小的操作
  10. ;;;
  11. ;;;定义了两个命令C:ZZ用来生成新的注记
  12. ;;;              C:ZC用来修改已有的注记

  13. ;;;关于"注记分类.txt"的格式
  14. ;;; 请看下面函数的说明,另外在随附的我用的"注记分类.txt"文档中亦有说明

  15. ;;;关于全局变量*MapBlc*
  16. ;;;我用它用存放图形的比例尺.
  17. ;;;我们是将它放在系统变量userr1中的,1为1:1000,0.5为1:500
  18. ;;;用它来确定注记字高.因为在"注记分类.txt"中指定的字高是1:1000下的
  19. ;;;需要用当前比例尺进行换算
  20. ;;;如果您的比例尺设定方法与此不同,请自行修改
  21. ;;;所以此处若没有此变量则将*MapBlc设置为0.5(1:500)

  22. ;;;关于注记的文字样式 "text"
  23. ;;;程序总是试图使用 "text" 样式(因我们用的是这个),如果当前图形中没有此样式,
  24. ;;;则使用当前样式,若用户有自己的需要,烦请自行修改
  25. ;;;还有要注意的是生成文字的对齐方式为"中间",若用户有不同的要求可按下表修改程序:
  26.     ;;对齐方式有如下几种:
  27.     ;;    常量值             含义  值            常量值             含义  值
  28.     ;;----------------------------------------------------------------------
  29.     ;;acAlignmentLeft          左  0       ;;acAlignmentTopCenter   中上   7
  30.     ;;acAlignmentCenter        中  1       ;;acAlignmentTopRight    右上   8
  31.     ;;acAlignmentRight         右  2       ;;acAlignmentMiddleLeft  左中   9
  32.     ;;acAlignmentAligned     对齐  3       ;;acAlignmentMiddleCenter正中  10
  33.     ;;acAlignmentMiddle      中间  4       ;;acAlignmentMiddleRight 右中  11
  34.     ;;acAlignmentFit         调整  5       ;;acAlignmentBottomLeft  左下  12
  35.     ;;acAlignmentTopLeft     左上  6       ;;acAlignmentBottomCenter中下  13
  36.     ;;acAlignmentBottomRight 右下  14
  37. ;;;;;;;;;;;;;;;;;;   
  38. ;;;关于hj_1.sld
  39. ;;;这是我作的一张小图片,呵呵,新年快乐的图章.
  40. ;;;愿大家迎来一个欢欢喜喜的新春!

  41. ;;;请注意zj.lsp mydcl.dcl 注记分类.txt hj_1.sld要同时放在CAD的支持搜索路径之中

  42. ;;;最后祝您使用愉快!
  43. ;;;程序的不完善之处还望各位大侠指出,感谢!

  44.        



  45. ;;;--------------------------------------------------------
  46. ;;;函数:h:zj
  47. ;;;编制日期:2008.1.6
  48. ;;;功能: 生成/修改注记
  49. ;;;参数: enText 文本对象图元名
  50. ;;;      %way 1 新建注记  2 修改已有的注记
  51. ;;;备注:当新建注记时,请将参数enText置为nil
  52. ;;;      用于CR命令对注记进行修改时
  53. ;;;      本函数从"注记分类.txt"文件中读取注记分类信息,
  54. ;;;      因此用户可以通过修改"注记分类.txt"来定义自己的注记
  55. ;;;      分类信息."注记分类.txt"文件的格式如下:
  56. ;;;      未考虑宽高比
  57. ;;;
  58. ;|;<以下内容取自本人的"注记分类.txt">

  59. ;;;分号部分内容为注释,请勿修改
  60. ;;;注记文件格式:
  61. ;;;注记所在图层[空格]注记类别说明[空格]1:1000下注记字高[空格]本类常用注记1[空格]本类常用注记2[空格]本类常用注记3.......
  62. ;;;请注意一种注记占一行,不能够分成两行
  63. ;;;修改后重新运行命令即可看到修改的值
  64. ;;;最后祝您使用愉快
  65. ;;;by caddog 2008.1.7
  66. A12 地名、单位名 4.0 山
  67. A13 测量控制点 4.0
  68. A14 居民地和垣栅 2.5 土 砖 混 砼 钢 木 石 竹 破 建
  69. ...........
  70. ...........
  71. ...........

  72. ;|;;
  73. ;;;--------------------------------------------------------
  74. ;|;
  75. 本函数将注记分类文件分解为如下几张表
  76. #zjFL 的格式如下:
  77. (("A12" . "地名、单位名")
  78.   ("A13" . "测量控制点")
  79.   ("A14" . "居民地和垣栅")
  80.   ("A15" . "工矿建(构)筑物及其它设施")
  81.   ("A16" . "交通及其它设施")
  82.   ("A17" . "管线及附属设施")
  83.   ("A18" . "水系及附属设施")
  84.   ("A19" . "境界")
  85.   ("A20" . "地貌和土质")
  86.   ("A21" . "植被")
  87. )
  88. #zjHeight的格式如下

  89. #zjKey 的格式如下
  90. ("A12" "A13" "A14" "A15" "A16" "A17" "A18" "A19" "A20" "A21")
  91. #zjTypeList 的格式如下
  92. (("A12" ("山"))
  93.   ("A13" nil)
  94.   ("A14" ("土" "砖" "混" "砼" "钢" "木" "石" "竹" "破" "建"))
  95.   ("A15" ("水" "涌"    "探"    "车"    "铁"    "铜"    "煤"    "硫"
  96.                "磷"    "油"    "废"    "气"    "沙"    "球"    "伞"
  97. ..........................
  98.   ("A21" ("藕" "菱"   "茭"   "茨"   "喷灌" "苹"          "梨"         "桃"        "桔"
  99.                "栗"   "杏"   "椰"   "咖"   "葡"          "蕉"         "蔗"        "椒"
  100.                "花椒" "啤"   "松"   "柏"   "桦"          "槟"         "桐"        "漆"
  101.                "榆"   "杨"   "柳"   "青?" "枫"          "椴"         "栎"        "柞"
  102.                "樟"   "油茶" "棕"   "苗"   "苇"          "席"         "芒"        "芒果"
  103.               )
  104.   )
  105. )

  106. ;|;;
  107. (defun h:zj( enText %way / #temp1 id-key #ZJ #ZJFL #ZJKEY #ZJTYPE #ZJTYPELIST $LAYEROLD $TEXT1 $VALUE %IDZJ %RESV DCL_ID HEIGHT WIDTH X Y)
  108.   (if enText
  109.   (setq $text1 (cdr(assoc 1 (entget enText)))
  110.         $layerOld(cdr(assoc 8 (entget enText)))
  111.         ;;*MAPBLC* (GETVAR "userr1") ;_有可能图形打开时比例尺不对,用户会进行更改所以要重新读取
  112.         )
  113.     (setq $text1 "" $layerOld "")
  114.     )
  115.   ;;将注记分类.txt文件读为表
  116.   (setq #zj (hj:file2list (findfile "注记分类.txt"))
  117.         #zjType nil #zjTypeList nil #zjFL nil #zjKey nil #zjHeight nil)
  118.   ;;将读出的字符串解析为前面提到的几个表
  119.   (foreach #x #zj
  120.     (setq %idzj 3)
  121.     (setq #x (hj:str2list #x " "))
  122.     ;(if (>(length #x) 2)
  123.     (setq #zjTypeList (append #zjTypeList (list(cons (car #x) (list(cdddr #x))))))
  124.     (setq #zjHeight (append #zjHeight (list (cons (car  #x) (caddr #x)))))
  125.     (setq #zjFL(append #zjFL (list (cons(car #x) (cadr #x)))))
  126.     (setq #zjKey(append #zjKey(list (car #x))))
  127.     ;  )
  128.     (repeat (- (length #x) 3)
  129.       (setq #zjType (append #zjType (list (cons (nth %idzj #x) (car #x))))
  130.             %idzj (1+ %idzj)
  131.             )
  132.       );_end repeat
  133.     );end_foreach
  134.   ;;得到了表,下面调用对话框
  135.   (SETQ dcl_id (LOAD_DIALOG "mydcl"))
  136.   (IF (< dcl_id 0)
  137.     (EXIT)
  138.     ) ;_ 结束if
  139.   (NEW_DIALOG "diaModiZJ" dcl_id)
  140.   ;;设置各控件的值
  141.   ;;先是图像控件
  142.   (setq width (dimx_tile "image1")
  143.         height (dimy_tile "image1"))
  144.   (start_image "image1")
  145.   (fill_image 0 0 width height 53)        ;_用53号色填充图像窗口
  146.   (end_image)                           ;_显示图片
  147.   (setq x (dimx_tile "image1")
  148.         y (dimy_tile "image1"))
  149.   (start_image "image1")
  150.   ( slide_image 0 -15 x y "hj_1")
  151.   (end_image)  
  152.   ;;....
  153.   
  154.   (if (= %way 2)  ;_若是修改注记命令调用本函数
  155.     (progn
  156.       (MODE_TILE "edit2" 1)
  157.       (MODE_TILE "bu_zj" 1)
  158.       )
  159.     )  
  160.   (SET_TILE "edit1" $text1) ;_设置注记内容 编辑框的值
  161.   (SET_TILE "edit2" $layerOld);_设置所在图层 编辑框的值
  162.   (START_LIST "list2") ;_添加 预测图层 下拉列表框的列表项
  163.   (mapcar '(LAMBDA(x) (ADD_LIST (strcat (car x) " " (cdr x))))  #zjFL)
  164.   (end_list)
  165.   (START_LIST "pop1")
  166.   (mapcar '(LAMBDA(x) (ADD_LIST (car x))) #zjFL)
  167.   (END_LIST)
  168.   
  169.   (hj:zj-3 $text1);_调用函数,根据文字的值分析它所在的图层
  170.   
  171.   (action_tile "list2" "(hj:zj-1 $value)");_当在注记分类 列表框中点击时发生,根据所选类别更新备选注记 列表框(LIST1)
  172.   (action_tile "list1" "(hj:zj-2 $value)");_当在备选注记 列表框中点击时发生,更新注记内容编辑框及预测图层下拉列表框
  173.   (action_tile "edit1" "(hj:zj-3 $value)");_当在注记内容编辑框中输入内容时发生
  174.   (action_tile "pop1"  "(hj:zj-1 $value)");_当点选了预测图层下拉列表框
  175.   (ACTION_TILE "bu_zj" "(DONE_DIALOG 2)")
  176.   (ACTION_TILE "bu_setup" "(DONE_DIALOG 3)")  
  177.   (ACTION_TILE "accept" "(DONE_DIALOG 1)")
  178.   (ACTION_TILE "cancel" "(DONE_DIALOG 0)")
  179.   (SETQ %resv (START_DIALOG))
  180.   (cond
  181.     ((= %resv 3)
  182.      (command"notepad"(findfile"注记分类.txt"))
  183.      )
  184.     ((= %resv 1) ;_如果新输入了注记又未指定图层,则图层定为"A15500",字高定为2.5*比例尺
  185.      (if (/= $text1 "") (list $text1 (if id-key (nth id-key #zjKey)"A15500") (if id-key (*(atof(cdr(nth id-key #zjHeight)))*MAPBLC*)(* 2.5 *MAPBLC*))) nil)
  186.      )
  187.     ((= %resv 2)
  188.      (if (/= $text1 "") (list $text1 (if id-key (nth id-key #zjKey)"A15500") (if id-key (*(atof(cdr(nth id-key #zjHeight)))*MAPBLC*)(* 2.5 *MAPBLC*))) nil)
  189.      )
  190.     (t nil)
  191.     )

  192. )
  193. ;;查找用户输入的注记所在的图层,若找到则更新预测图层下拉列表框的值
  194. (defun hj:zj-3 ($value /)
  195.   (setq $text1 $value)
  196.   (setq $layer (cdr(assoc $text1 #zjType)))
  197.   (if $layer
  198.     (progn
  199.       (SET_TILE "pop1" (itoa (-(length #zjKey)(length(member $layer #zjKey)))))
  200.       (hj:zj-1 (itoa (-(length #zjKey)(length(member $layer #zjKey)))))
  201.       )
  202.     )
  203.   
  204.   )
  205.   
  206. ;;按用户所选择的类别更新"备选注记"列表框的内容
  207. (defun hj:zj-1 ($value / )
  208.   (setq !value (atoi $value)
  209.         id-key !value)
  210.   (setq #temp1 (cadr(nth !value #zjTypeList)))
  211.   (if #temp1
  212.     (progn
  213.       (START_LIST "list1")
  214.       (mapcar 'ADD_LIST #temp1)
  215.       (END_LIST)
  216.       )
  217.     (progn
  218.       (START_LIST "list1")
  219.       ;;(mapcar 'ADD_LIST #temp1)
  220.       (END_LIST)
  221.       )
  222.     );_end if
  223.   (SET_TILE "error" (strcat "注记字高:" (rtos(* *MAPBLC*(atof(cdr(nth id-key #ZJHEIGHT)))) 2 2)))
  224.   )
  225. ;;当在备选注记 列表框中点击时,更新注记内容编辑框及预测图层下拉列表框  
  226. (defun hj:zj-2 ($value)
  227.   (setq !value (atoi $value))
  228.   (setq $text1 (nth !value #temp1))
  229.   (if $text1
  230.     (progn
  231.       (SET_TILE "edit1" $text1)
  232.       (set_tile "pop1" (itoa id-key))
  233.       ;;(set_tile "edit2" (car(nth id-key #zjTypeList)))
  234.       );_end progn
  235.     )
  236.   )
  237.   
  238. ;;将文件按行解析为表
  239. (defun hj:file2list (fn / f l ll)
  240.   (setq f (open fn "r"))
  241.   (while (setq l (read-line f))
  242.     ;;(setq ll (cons (read (strcat "(" l ")")) ll))
  243.     (if (/= (substr l 1 3) ";;;")
  244.     (setq ll (append ll (list l)))
  245.       )
  246.   )
  247.   (close f)
  248.   ll
  249. )

  250. ;;将字符串按分隔符解析为表
  251. (defun hj:Str2List (string symble / )
  252.   (setq len (strlen string)
  253.         %id 1
  254.         #rev nil
  255.         $str "" )
  256.   (repeat len
  257.     (if (and (vl-string-search  (substr string %id 1) symble) (/= $str ""))
  258.       (setq #rev (append #rev (list $str))
  259.             $str "")
  260.       (if (not (vl-string-search (substr string %id 1) symble) )
  261.         (setq $str (strcat $str (substr string %id 1)))
  262.         )
  263.       )      
  264.     (setq %id (1+ %id))
  265.     );_end repeat
  266.   (if (/= $str "") (append  #rev (list $str)) #rev)
  267.   )

  268. ;;;以下代码取自AUTOCAD的帮助.
  269. ;;;在使用VLA-ADD时要调用
  270. (SETQ *acad-object* nil)                ; Initialize global variable
  271. (DEFUN acad-object  ()
  272.   (COND        (*acad-object*)                        ; Return the cached object
  273.         (T
  274.          (SETQ *acad-object* (VLAX-GET-ACAD-OBJECT))
  275.          )
  276.         ) ;_ 结束cond

  277.   ) ;_ 结束defun

  278. (SETQ *active-document* nil)                ; Initialize global variable
  279. (DEFUN active-document        ()
  280.   (COND        (*active-document*)                ; Return the cached object
  281.         (T
  282.          (SETQ *active-document* (VLA-GET-ACTIVEDOCUMENT (acad-object)))
  283.          )
  284.         ) ;_ 结束cond

  285.   ) ;_ 结束defun

  286. (SETQ *model-space* nil)                ; Initialize global variable
  287. (DEFUN model-space  ()
  288.   (COND        (*model-space*)                        ; Return the cached object
  289.         (T
  290.          (SETQ *model-space* (VLA-GET-MODELSPACE (active-document)))
  291.          )
  292.         ) ;_ 结束cond


  293.   ) ;_ 结束defun
  294.   
  295.   
  296. ;;;--------------------------------------------------------
  297. ;;;函数:c:zz
  298. ;;;编制日期:2008.1.6    作者:caddog
  299. ;;;功能: 注记文本
  300. ;;;备注:
  301. ;;;--------------------------------------------------------
  302. (defun c:zz (/ #revs !sideHeight)
  303.   (setq               
  304.         *MapBlc* (if  (GETVAR "userr1")(GETVAR "userr1") 0.5);_取图形的比例尺.
  305.         #revs (h:zj nil 1)
  306.         ;;我们是将它放在系统变量userr1中的,1为1:1000,0.5为1:500
  307.         ;;用它来确定注记字高.因为在"注记分类.txt"中指定的字高是1:1000下的
  308.         ;;需要用当前比例尺进行换算
  309.         ;;如果您的比例尺设定方法与此不同,请自行修改
  310.         ;;所以此处若没有此变量则将*MapBlc设置为0.5(1:500)
  311.   )
  312.   
  313.   (if #revs
  314.     (progn
  315.       (setq pt1 (getpoint "\n选择注记点位:"))
  316.       (if(tblsearch "style" "text") ;_设置文字样式为"text",若没有则为当前样式
  317.         (setvar "TEXTSTYLE" "text")       
  318.         )
  319.       (while pt1
  320.        
  321.           (setq        objText        (vla-AddText
  322.                           (MODEL-SPACE)
  323.                           (car #revs)
  324.                           (vlax-3d-point pt1)
  325.                           (caddr #revs)
  326.                         )
  327.           )
  328.           (if (null (tblsearch "layer" (cadr #revs)))
  329.             (vla-add (vla-get-layers (ACTIVE-DOCUMENT)) (cadr #revs))
  330.           )
  331.           (VLA-PUT-ALIGNMENT objText 4)
  332.           (vla-put-layer objText (cadr #revs))
  333.           (VLA-PUT-TEXTALIGNMENTPOINT objText (VLAX-3D-POINT pt1));_文字对齐方式为"中间"
  334.        
  335.         (setq pt1 (getpoint "\n选择注记点位:"))
  336.        
  337.       ) ;_end if pt1
  338.       
  339.     ) ;_end progn
  340.   )
  341. (princ)
  342. )
  343. ;;;修改注记
  344. ;;;可根据注记内容,自动判定应放置的层次及字高--当然是在用户已在"注记分类.txt"中加入了该注记之后
  345. (defun c:zc(/ #revs)
  346. (setq ss (ssget ":s"))
  347. (if ss (progn
  348. (setq ss1 (ssname ss 0)
  349.             obj1(vlax-ename->vla-object ss1)
  350.             objType(vla-get-objectname obj1))
  351. (if (eq objType "AcDbText")
  352. (progn            
  353.   (setq #revs (h:zj ss1 2))
  354.   (if #revs
  355.     (progn
  356.       (vla-put-TextString obj1 (car #revs))
  357.       (if (null (tblsearch "layer" (cadr #revs)))
  358.         (vla-add (vla-get-layers (ACTIVE-DOCUMENT)) (cadr #revs))
  359.         )      
  360.       (vla-put-layer obj1 (cadr #revs))
  361.       (vla-put-Height obj1(caddr #revs))
  362.       );_end progn
  363.     )
  364.     )
  365.     )
  366.   ;;(princ)
  367.   )
  368.   )
  369.   );_end defun
  370.   [/FONT]


J:\hj\zj.bmp
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2008-2-4 01:48:57 | 显示全部楼层
好东西哦~挺方便D
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-2-4 20:17:22 | 显示全部楼层
值得借鉴
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-2-26 13:20:53 | 显示全部楼层
好东西.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-16 21:37 , Processed in 0.195357 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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