明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 532|回复: 6

根据测绘坐标数据展绘块

[复制链接]
发表于 2024-12-9 15:18:59 | 显示全部楼层 |阅读模式


;;; 功能:根据测绘数据文件(代码描述及点坐标)在平面图上展绘块
;;; 日期:2024 年 12 月 9 日
;;; 主要代码来源于论坛,感谢各前辈大佬。


能展绘的前提是:1,已经有相应名称的块,已加载到文件中或存放在“支持文件搜索路径”下。2,测绘数据文件满足要求(看本文最后)。

以下是全部代码。愿意打赏的可以到附件下载。感谢大家!

  1. ;;; 功能:根据测绘数据文件(坐标)在平面图上展绘块
  2. ;;; 日期:2024 年 12 月 9 日
  3. ;;; 主要代码来源于论坛,感谢各前辈大佬

  4. (vl-load-com)

  5. (defun slice-list (lst start end / len sliced result i)  ; 定义一个函数,用于切片列表
  6.   (setq len (length lst)) ; 获取列表长度
  7.   (setq sliced nil) ; 初始化切片列表
  8.   (setq result nil) ; 初始化结果列表
  9.   ; 处理负索引和 end 为 nil 的情况
  10.   (if (< start 0)  ; 如果开始索引为负数,转换为正索引
  11.     (setq start (+ len start))
  12.   )

  13.   (if (null end)  ; 如果结束索引为 nil,设置为列表长度
  14.     (setq end len)
  15.   )
  16.   (if (< end 0)  ; 如果结束索引为负数,转换为正索引
  17.     (setq end (+ len end))
  18.   )
  19.   (if (and (listp lst) (numberp start) (numberp end) (<= start end))  ; 检查参数类型和范围
  20.     (progn  ; 如果参数有效,则进行切片操作
  21.       (setq sliced lst) ; 复制原列表到切片列表
  22.       (setq i 0) ; 初始化计数器
  23.       (repeat start  ; 使用 repeat 和 cdr 模仿 nthcdr 功能
  24.         (setq sliced (cdr sliced)) ; 逐步缩减切片列表以模拟 nthcdr
  25.       )
  26.       (setq i start) ; 设置 i 为开始索引
  27.       (while (and sliced (> end i))  ; 遍历列表并构建切片
  28.         (setq result (cons (car sliced) result)) ; 将当前元素添加到结果列表
  29.         (setq sliced (cdr sliced)) ; 指向下一个元素
  30.         (setq i (+ i 1)) ; 更新计数器
  31.       )
  32.       (reverse result) ; 反转结果列表以保持原始顺序
  33.     )
  34.     (alert "Invalid arguments for slicing.") ; 参数无效时的警告
  35.   )
  36. )

  37. ;; 定义 str-th 函数
  38. (defun str-th (STR LST / I A B LEN-A TMP J STRJ)
  39.   (if (and STR LST)
  40.       (progn
  41.         (setq I 0)
  42.         (repeat (length LST)
  43.           (setq    A     (car (nth I LST)))
  44.           (setq    LEN-A (strlen A))
  45.           (setq    B     (cadr (nth I LST)))
  46.           (setq    TMP   "")

  47.           (if (>= (strlen STR) LEN-A)
  48.             (progn
  49.               (setq J 1)
  50.               (repeat (- (strlen STR) LEN-A -1)
  51.                 (setq STRJ (substr STR J 1 ) )
  52.                 (if (= STRJ A)
  53.                   (setq TMP (strcat TMP B) )
  54.                   (setq TMP (strcat TMP STRJ))
  55.                 )
  56.                 (setq J (1+ J))
  57.               )
  58.             )
  59.           )

  60.           (setq I   (1+ I))
  61.           (setq  STR TMP)

  62.         )
  63.       )
  64.     ) ;_结束 if
  65.   STR
  66. ) ;_ 结束 defun str-th



  67. ; 函数: PARSE2
  68. ; 功能: 解析一个字符串,根据给定的分隔符将其分割成一个子字符串列表。
  69. ; 参数:
  70. ;   STR - 要解析的原始字符串。
  71. ;   DELIM - 用作分隔符的字符串,函数将根据此分隔符来分割 STR。
  72. ; 局部变量:
  73. ;   LST - 存储分割后的子字符串列表。
  74. ;   POS - 分隔符在字符串中的位置。
  75. ; 返回值: 一个列表,包含按照分隔符分割的所有子字符串。
  76. ; 注意: 如果分隔符在字符串的末尾,那么最后一个子字符串将是一个空字符串。
  77. ;       如果分隔符不在字符串中,则返回包含原始字符串的单个元素列表。
  78. ; 示例: (PARSE2 "one,two,three" ",") 返回 ("one" "two" "three")
  79. (DEFUN PARSE2 (STR DELIM / LST POS)
  80.   ; 初始化变量LST和POS
  81.   (while (and (setq POS (VL-STRING-SEARCH DELIM STR)))
  82.     ; 将DELIM之前的子字符串添加到列表LST中,然后更新STR
  83.     (setq LST (APPEND LST (LIST (SUBSTR STR 1 POS))))
  84.     (setq STR (SUBSTR STR (+ 2 POS)))
  85.   )
  86.   ; 如果STR长度大于0,则将STR添加到LST中,否则返回LST
  87.   (if (> (STRLEN STR) 0)
  88.     (PROGN (APPEND LST (LIST STR)))
  89.     (PROGN LST)
  90.   )
  91. )


  92. (defun entmake-dzw(km pt co la bm / data);插块 改颜色图层编码
  93.     (command-s "_.insert" km "x" KBL "y" KBL "z" KBL "non" pt "") ;块比例
  94.     (command-s "chprop" (entlast)"" "c" co "la" la "")
  95.     (setq data(entget (entlast)))
  96.     (setq data(append data bm))
  97.     ;(entmod data)
  98.   )

  99. (defun C:ZH ( / FILE i zn MN moden IN XN YN F1 STR str1 LST zdm)
  100.   (setvar "cmdecho" 0)
  101.   (setq oldom (getvar "osmode"))
  102.   (setvar "osmode" 0)
  103.   (setq LUJING1 "C:\\Users\") ; 设置路径1
  104.     (setq LUJING2 "\\Desktop\") ; 设置路径2
  105.     (setq yonghuming  (getvar "loginname")) ; 获取当前用户登录名
  106.   (defun *error* (msg)
  107.     (if oldom
  108.       (setvar "OSMODE" oldom)
  109.     ))
  110.   (setq KBL (getreal "\n请设定展绘的块比例:<1>"));块比例设置
  111.   (if (null KBL)(setq KBL 1))
  112.   (setq mode (getstring "\n 请输入数据文件内数列排序格式:[(须大写)编号(I),X 值(X),Y 值(Y),Z 值(Z),DM(M)]默认<MIYXZ>:"))
  113.   (setq FILE (getfiled "选择.dat.txt 文件" (strcat LUJING1 yonghuming LUJING2) "dat;txt" 8))
  114.   (if (or (= mode nil) (= mode ""))
  115.       (setq mode "MIYXZ")
  116.   )
  117.   (setq i 1)
  118.   (setq zn "")
  119.   (setq MN "")
  120.   (setq moden (strlen mode))
  121.   (while ( < i (+ moden 1))
  122.    (cond ((= (substr mode i 1) "I")  (setq IN (- i 1)))
  123.          ((= (substr mode i 1) "X")  (setq XN (- i 1)))
  124.          ((= (substr mode i 1) "Y")  (setq YN (- i 1)))
  125.          ((= (substr mode i 1) "Z")  (setq ZN (- i 1)))
  126.          ((= (substr mode i 1) "M")  (setq MN (- i 1)))
  127.     )
  128.   
  129.     (setq i ( + i 1))
  130.   ) ; while
  131. ;============================
  132. ;定义命令编组开始
  133.    (command "_.undo" "be")
  134.   ;; 以读模式打开文件
  135.   (setq F1 (open FILE "r"))
  136.   (setq DNLST (list ""))
  137.   (setq i 0)
  138.   (setq j 0)
  139.   (while (and (/= nil (setq S (READ-LINE F1))))
  140.         (setq P (slice-list (PARSE2 S ",") -5 nil))
  141.        ;;(setq P (get-last-three (PARSE2 S ",")))
  142.               ;(setq P (LIST (NTH 2 P) (NTH 3 P) (NTH 4 P))) ; 创建坐标列表
  143.         (setq dm (NTH MN P))
  144.         (setq x0 (NTH XN P))
  145.         (setq y0 (NTH YN P))
  146.               ;(setq P (MAPCAR 'ATOF P)) ; 将字符串转换为浮点数
  147.         (setq x (ATOF x0)) ; 将字符串转换为浮点数
  148.         (setq y (ATOF y0)) ; 将字符串转换为浮点数
  149.         
  150.     ;(if (and (tblsearch "block" dm) ((= (vl-string-search (car pair) (vl-princ-to-string feature-code)) 0)))
  151.     (if (tblsearch "block" dm)
  152.         (progn
  153.         (entmake-dzw dm (list y x) 2 "0" '((-3 ("SOUTH" (1000 . "175101")))))
  154.         ;(princ (strcat "\n绘制 " dm " 成功。"))
  155.         (setq j (+ j 1))
  156.         )
  157.         (progn
  158.         ;(princ (strcat "\n\n未找到与【" dm "】相匹配的块,【" dm "】未能绘制成功。"))
  159.         (setq DNLST (append DNLST (list "第" i "行:" dm "、")))
  160.         )
  161.     )
  162.       (setq i (+ i 1))
  163.             )
  164.       
  165. (princ (strcat "\n展绘完成。数据文件共" (vl-princ-to-string i) "行,导入" (vl-princ-to-string j) "个图元。"))
  166. (princ (strcat "\n数据文件中:" (vl-princ-to-string DNLST) "等共计" (vl-princ-to-string (- i j)) "个图元未能绘制成功。"))
  167. (princ (strcat "请查改数据文件或创建、导入相应名称的图块。\n"))
  168.             (CLOSE F1) ; 关闭文件
  169. ;==========================
  170.    (COMMAND "_.UNDO" "E")
  171. ;定义命令编组结束
  172.   (setvar "osmode" oldom)
  173.   (princ)
  174. ) ;_ 结束 defun







也是花了些时间和精力的。
愿意赏点小钱的爷请点这里下载:


附:
测绘数据文件说明:
是以逗号分隔的数据文本文件,按5列保存,顺序可调。具体代码中IXYZM含义:编号(I),X 值(X),Y 值(Y),Z 值(Z),DM(M)。
例如下面表格,数据顺序是MIXYZ:
棱锥造型
10713.49
53476.36
9.762
大叶黄杨球
10708.89
53478.96
9.715
螺旋造型
10703.16
53473.78
9.622
圆顶香樟
10702.74
53475.82
9.674
香樟
10701.56
53478.07
11.152
红花檵木球
10700.93
53481.22
11.14
1蘑菇造型
10706.78
53480.78
11.2
长颈鹿头造型
10705.77
53483.1
11.197
无患子
10707.87
53488.78
12.723
造型法桐
10705.81
53490.85
12.73
M确定块名,X、Y确定X、Y坐标
。I、Z列的数据在本插件中没有用到。

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
bssurvey + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2024-12-9 17:03:41 | 显示全部楼层
感谢大佬的热心分享~
回复 支持 反对

使用道具 举报

发表于 2024-12-9 22:49:53 | 显示全部楼层
无论如何,共享的态度不要这么谦卑
回复 支持 反对

使用道具 举报

发表于 2024-12-10 08:10:32 | 显示全部楼层
谢谢分享,下载学习
回复 支持 反对

使用道具 举报

发表于 2024-12-10 18:32:26 | 显示全部楼层
感谢大佬的热心分享~
回复 支持 反对

使用道具 举报

发表于 昨天 10:09 | 显示全部楼层
很好→很棒!很好~很棒!!很好……很棒!!!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-19 05:27 , Processed in 0.149002 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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