明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2645|回复: 3

[源码] 地质上的,布剖面线

[复制链接]
发表于 2014-11-19 01:03:00 | 显示全部楼层 |阅读模式
本帖最后由 wzg356 于 2014-11-19 01:27 编辑

学llsp,源自不想被其它插件绑定
来明经近一年了,目前可以编写简单的插件了
小东西,代码长
就我而言,达到目的就行
纠结于最求完美反而剑走偏锋,荒废专业

里面有几个字符串函数也是自己写的,可以收集改进

分享一下
有高手来把它简化更好
  1. ;布剖面线;
  2. ;wzg356 写于20140926
  3. (defun c:pmx ( / sc pmbh answer )
  4.   
  5.   (princ "\n假定CAD中绘制比例为1:1千")
  6.   (if (not (setq sc (getreal "\n输入出图比例,1代表1:1千,10代表1:1万,以此类推<1>: ")))(setq sc 1.0))
  7.   (setq pmbh (getstring "\n输入剖面编号<1>:"))
  8.   (if (= pmbh "")(setq pmbh "1"))
  9.   (setq pmbh(apply 'strcat (mapcar 'vl-princ-to-string (read (strcat "(" pmbh ")")))));消除空格
  10.   (setq answer "Yes")
  11.   (while (= answer "Yes")
  12.     (drawpmx pmbh sc);画剖面
  13.     (initget  "Yes No")
  14.     (setq answer (getkword "\n是否继续下一条剖面线? [Yes/No]<No>:"))
  15.     (if (= answer nil)(setq answer "No"))
  16.     (setq pmbh (endnumchange pmbh 1));如果编号末尾是数字,编号加1
  17.     (setq pmbh (endABCchange pmbh 1));如果编号末尾是字母,编号递增
  18.   )   
  19. )

  20. (defun drawpmx (pmbh sc / newerr sysvarlst *olderror* en pt1 pt2 pml pmjd tmp
  21.                    PT3 pt4 pt_2 pt5 pt6 en1 en2 en3 en4)
  22.   ;自定义新的出错函数
  23.     (defun newerr (msg)
  24.       (mapcar 'eval sysvarlst);恢复变量设置
  25.       (if *olderror* (setq *error* *olderror*  *olderror* nil)) ;_ 恢复*error*函数
  26.       (if (not (member msg '(nil "函数被取消" ";错误:quit / exit abort")))
  27.         (princ (strcat ";错误:" msg))
  28.     )
  29.   )
  30.   ;;系统设置
  31.   (command "undo" "be");;命令编组开始
  32.   (setq sysvarlst(mapcar (function (lambda (n) (list 'setvar n (getvar n))))
  33.       '( "osmode" "cmdecho" "OSNAPCOORD"  "plinewid" "clayer" "cecolor")));保存系统变量
  34.   (setq *olderror* *error*);保存出错函数
  35.   (setq  *error* newerr);设置自定义出错函数  
  36.   (setvar "cmdecho" 0);;;关闭命令响应
  37.   (setvar "OSNAPCOORD" 1);;;坐标数据优先级设为:键盘输入替代对象捕捉设置
  38.   (setvar "OSMODE" 675);;;改变捕捉模式
  39.   (if (= (tblsearch "layer" "剖面") nil) (EntmakeLayer 7 "剖面"));如果无"剖面"图层,创建
  40.   (setvar "clayer" "剖面")
  41.   (setvar "cecolor" "4")

  42.   (if (= (Tblsearch "style" "MY_ST") nil)
  43.     (command "-style" "MY_ST" "宋体" 0 0.8 0 "n" "n");;;文字样式
  44.   )  
  45.     (setvar "textstyle" "MY_ST")  
  46.    
  47.   ;输入剖面起点、终点
  48.   (command "line" (getpoint "\n指定剖面起点:") pause "");取得剖面两端点
  49.   (setq en (entlast))  
  50.   (setq pt1 (cdr(assoc 10 (entget en))))
  51.   (setq pt2 (cdr(assoc 11 (entget en))))
  52.   (command "_erase" en "")
  53.   (setq pt1 (mapcar '+ pt1 '(0 0)));转为二维点
  54.   (setq pt2 (mapcar '+ pt2 '(0 0)));转为二维点
  55.   (setq pml (distance pt1 pt2));转为二维坐标计算剖面长度
  56.   (setq pmjd (* 180.0 (/ (angle pt1 pt2) pi)));线的角度
  57.   (setvar "plinewid" (* sc 0.5));剖面线宽
  58.   (if (or
  59.     (> (abs (- pmjd 90)) 1)
  60.     (> (abs (- pmjd 270)) 1)
  61.     );如果剖面线不是近南北向
  62.     (if (> (car pt1) (car pt2))
  63.         (setq tmp pt1 pt1 pt2  pt2 tmp);两点交换,把左边点置为剖面起点
  64.       )
  65.       (if (> (cadr pt1) (cadr pt2))
  66.         (setq tmp pt1 pt1 pt2  pt2 tmp);两点交换,把南边点置为剖面起点
  67.       )
  68.   )
  69.   (setq PT3 (polar pt1 (* 0.5 PI) (* 3.0 sc));起点截止线点
  70.       pt4 (polar pt1 (* -0.5 PI) (* 3.0 sc));起点截止线点
  71.       pt_2 (polar pt1 0 pml);为方便计算,选pt1正东向一点来过渡
  72.       pt5 (polar pt_2 (* 0.5 PI) (* 3.0 sc));终点截止线点
  73.       pt6 (polar pt_2 (* -0.5 PI) (* 3.0 sc));终点截止线点
  74.   )
  75.   
  76.   ;画剖面线   
  77.   (command "pline" pt1  pt2 "");;以指定宽度多线段画剖面线
  78.   (setq pmjd (* 180.0 (/ (angle pt1 pt2) pi)));线的角度
  79.   (command "pline" pt3  pt4 "");;以指定宽度多线段起点截止线
  80.   (setq en1 (entlast))
  81.   (command "pline" pt5 pt6 "");;以指定宽度多线段画终点截止线
  82.   (setq en2 (entlast))
  83.   (command "TEXT" "J" "MR" (polar pt1 (* -1.0 PI) (* 2.0 sc)) (* 4.0 sc) 0.0 pmbh);起点文字
  84.   (setq en3 (entlast))
  85.   (command "TEXT" "J" "ML" (polar pt_2 0 (* 2.0 sc)) (* 4.0 sc) 0.0 (strcat pmbh "′"));终点文字
  86.   (setq en4 (entlast))
  87.   (command "_rotate" en1 en2 en3 en4 "" pt1 pmjd "");旋转与剖面线对齐
  88.   
  89.   ;;恢复设置
  90.     (command "_undo" "_e");;活动编组结束
  91.   (mapcar 'eval sysvarlst);恢复变量设置
  92.   (setq *error* *olderror*);;恢复出错函数
  93.     (princ)  
  94. )
  95. ;;;字符串最后1个字母分离
  96. ;;(strEndIsABC "A2") 返回("A2" nil)
  97. ;;;;(strEndIsABC "A2a") 返回("A2" "a")
  98. ;;;;(strEndIsABC "c") 返回("" "c")
  99. ;;;;(strEndIsABC "bc") 返回("b" "c")
  100. ;;;;(strEndIsABC "3.5") 返回("3.5" nil)
  101. (defun strEndIsABC (str / e len str1 str2)
  102.   (setq Len (strlen str))
  103.   (setq str1 (substr str Len 1))
  104.   (setq e (ascii str1))
  105.   (if (and (> e 64) (< e 123));判断是否字母
  106.       (list (substr str 1 (1- len)) str1)
  107.       (list str nil)
  108.   )
  109. ) ;_ 结束defunr

  110. ;;应用示例,末尾字母(仅最后一个)增减
  111. ;;如果末尾无字母,返回原字串
  112. ;;当遇A,a递减时,不论步距,递减至Z,z
  113. ;;当遇Z,z递增时,不论步距,递增至A,a
  114. ;;str, ind分别为字串,步距
  115. ;;(endABCchange "a333.5G" -2)
  116. ;;(endABCchange "4" -2)
  117. (defun endABCchange (str ind / str1)
  118.   (setq str1 (cadr(strEndIsABC str)))  
  119.   (cond
  120.     ((and(= str1 "A") (< ind 0)) (setq str1 "Z"))
  121.     ((and(= str1 "a") (< ind 0)) (setq str1 "z"))
  122.     ((and(= str1 "Z") (> ind 0)) (setq str1 "A"))
  123.     ((and(= str1 "z") (> ind 0)) (setq str1 "z"))
  124.     ((= str1 nil) (setq str1 (substr str (strlen str)1)));末尾无字母不转换
  125.     (T (setq str1 (chr (+ (ascii str1) ind))))
  126.   )
  127.   (setq str (strcat (substr str 1 (1- (strlen str))) str1))
  128. )

  129. ;;字符串与末尾数字分离,返回字符串(或nil)、末尾数字(或nil)组成的表
  130. ;;(strEndIsNumber "222")返回("" "222")
  131. ;;;(strEndIsNumber "abcd")返回("abcd" nil)
  132. ;;;(strEndIsNumber "ab2")返回("ab" "2")
  133. ;;;(strEndIsNumber "ab2.2")返回("ab" "2.2")
  134. ;;;(strEndIsNumber "3")返回("" "3")
  135. (defun strEndIsNumber (str / e len str1 str2)
  136.   (if(numberp (read str ));判断是字符串是实数或整数
  137.     (list "" str)
  138.     (progn
  139.       (setq Len (strlen str))
  140.       (setq str1 (substr str Len 1))
  141.       (setq e (ascii str1))
  142.       (while (or (= e 46)(and (> e 47) (< e 58)));判断是小数点或数字
  143.         (if str2 (setq str2 (strcat str1 str2))(setq str2 str1))
  144.         (setq str (substr str 1 (1- len)))
  145.         (setq Len (strlen str))
  146.         (setq str1 (substr str Len 1))
  147.         (setq e (ascii str1))
  148.       )
  149.       (if (null str2) (list str nil)(list str str2))  
  150.     )
  151.   )
  152. ) ;_ 结束defun
  153. ;;应用示例:末尾数字加减,如果末尾无数字,返回原字串
  154. ;;str, ind分别为字串,步距
  155. ;;(endnumchange "a3" 1)
  156. ;;(endnumchange "aa" 1)
  157. (defun endnumchange (str ind / num jd)
  158.   (setq num (cadr(strEndIsNumber str)))
  159.   (if (/= num nil)
  160.     (if (member (type (read num)) (list 'INT));判断是否是INT整数型
  161.         (setq str(strcat (car(strEndIsNumber str))(rtos (+ (atof num) ind)2 0)))
  162.         (progn
  163.           (setq jd (- (- (strlen num)1) (strlen(rtos(atoi num)2 0))));取得小数位数
  164.           (setq str(strcat (car(strEndIsNumber str))(rtos (+ (atof num) ind)2 jd)))
  165.         )
  166.      )
  167.      str
  168.     )
  169. )
  170. ;[功能]entmake 图层
  171. ;[用法](EntmakeLayer  color str)
  172. ;(setq TK (tblsearch "layer" "TK"))
  173. ;  (if (= TK nil) (EntmakeLayer 7 "TK"))
  174. ;  (setvar "clayer" "TK")
  175. (defun EntmakeLayer (color str)
  176.   (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(70 . 0) '(6 . "Continuous") (cons 62 color) '(370 . 0) (cons 2 str)))
  177. )
  178. (princ)

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2015-8-31 19:16:30 来自手机 | 显示全部楼层
自己编的就是好程序
回复 支持 1 反对 0

使用道具 举报

发表于 2021-4-1 17:09:51 | 显示全部楼层
支持楼主,代码不在乎多少,能实现既定功能就是好程序
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-4-8 09:31 , Processed in 0.156409 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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