欢迎来到我的博客
Civil 3D开发与应用,欢迎加入QQ群:484124761
AutoCAD开发,欢迎加入QQ群:193522571

几何空间点原始描述字符串替换工具

AI编写的代码,放到这里备忘。



同事在画图时,
遇到了一个问题:

导入的几何空间点原始描述中有对于的字符,

需要删除,

于是让ai写了下面的代码。

 

;;; 几何空间点原始描述字符串替换工具
;;; 用于Civil 3D中批量修改几何空间点的原始描述

(defun c:ReplacePointDesc ( / ss searchStr replaceStr count i pointObj oldDesc newDesc)
  
  ;; 设置错误处理
  (vl-load-com)
  (setq *error* (lambda (msg) (princ (strcat "\n错误: " msg))))
  
  ;; 选择几何空间点
  (princ "\n选择几何空间点: ")
  (setq ss (ssget '((0 . "AECC_COGO_POINT"))))
  
  (if (not ss)
    (progn
      (princ "\n未选择任何几何空间点。")
      (exit)
    )
  )
  
  ;; 获取搜索字符串
  (setq searchStr (getstring T "\n输入要查找的字符串: "))
  
  ;; 检查搜索字符串是否为空
  (if (= searchStr "")
    (progn
      (princ "\n搜索字符串不能为空。")
      (exit)
    )
  )
  
  ;; 获取替换字符串(默认为空字符串)
  (setq replaceStr (getstring T "\n输入替换的字符串(直接回车使用空字符串): "))
  
  ;; 如果用户直接回车,设置为空字符串
  (if (= replaceStr "")
    (setq replaceStr "")
  )
  
  ;; 确认操作
  (princ (strcat "\n将在 " (itoa (sslength ss)) " 个点上执行替换:"))
  (princ (strcat "\n查找: \"" searchStr "\""))
  (princ (strcat "\n替换为: \"" replaceStr "\""))
  
  (initget "是 否")
  (setq confirm (getkword "\n是否继续? [是/否] <是>: "))
  
  (if (or (= confirm "") (= confirm "N"))
    (progn
      (princ "\n操作已取消。")
      (exit)
    )
  )
  
  ;; 开始替换操作
  (setq count 0)
  (setq i 0)
  
  (repeat (sslength ss)
    (setq pointObj (vlax-ename->vla-object (ssname ss i)))
    
    ;; 获取原始描述
    (setq oldDesc (vlax-get-property pointObj 'RawDescription))
    
    ;; 检查描述是否存在且包含搜索字符串
    (if (and oldDesc (/= oldDesc "") (vl-string-search searchStr oldDesc))
      (progn
        ;; 执行字符串替换
        (setq newDesc (vl-string-subst replaceStr searchStr oldDesc))
        
        ;; 更新点的原始描述
        (vlax-put-property pointObj 'RawDescription newDesc)
        
        (setq count (1+ count))
        (princ (strcat "\n点 " (itoa (1+ i)) " 描述已更新: " newDesc))
      )
      (princ (strcat "\n点 " (itoa (1+ i)) " 未包含搜索字符串或描述为空"))
    )
    
    (setq i (1+ i))
  )
  
  ;; 显示操作结果
  (princ (strcat "\n\n操作完成! 共处理了 " (itoa count) " 个点的描述。"))
  (princ)
)

;;; 增强版本:支持大小写不敏感搜索和全局替换
(defun c:ReplacePointDescEx ( / ss searchStr replaceStr count i pointObj oldDesc newDesc caseSensitive)
  
  (vl-load-com)
  (setq *error* (lambda (msg) (princ (strcat "\n错误: " msg))))
  
  ;; 选择几何空间点
  (princ "\n选择几何空间点: ")
  (setq ss (ssget '((0 . "AECC_COGO_POINT"))))
  
  (if (not ss)
    (progn
      (princ "\n未选择任何几何空间点。")
      (exit)
    )
  )
  
  ;; 获取搜索字符串
  (setq searchStr (getstring T "\n输入要查找的字符串: "))
  
  (if (= searchStr "")
    (progn
      (princ "\n搜索字符串不能为空。")
      (exit)
    )
  )
  
  ;; 获取替换字符串
  (setq replaceStr (getstring T "\n输入替换的字符串(直接回车使用空字符串): "))
  
  (if (= replaceStr "")
    (setq replaceStr "")
  )
  
  ;; 选择是否区分大小写
  (initget "是 否")
  (setq caseSensitive (getkword "\n是否区分大小写? [是/否] <是>: "))
  
  (if (or (= caseSensitive "") (= caseSensitive "N"))
    (setq caseSensitive nil)
    (setq caseSensitive T)
  )
  
  ;; 确认操作
  (princ (strcat "\n将在 " (itoa (sslength ss)) " 个点上执行替换:"))
  (princ (strcat "\n查找: \"" searchStr "\""))
  (princ (strcat "\n替换为: \"" replaceStr "\""))
  (princ (strcat "\n区分大小写: " (if caseSensitive "" "")))
  
  (initget "是 否")
  (setq confirm (getkword "\n是否继续? [是/否] <是>: "))
  
  (if (or (= confirm "") (= confirm "N"))
    (progn
      (princ "\n操作已取消。")
      (exit)
    )
  )
  
  ;; 开始替换操作
  (setq count 0)
  (setq i 0)
  
  (repeat (sslength ss)
    (setq pointObj (vlax-ename->vla-object (ssname ss i)))
    (setq oldDesc (vlax-get-property pointObj 'RawDescription))
    
    (if (and oldDesc (/= oldDesc ""))
      (progn
        ;; 根据是否区分大小写进行搜索
        (if caseSensitive
          (setq found (vl-string-search searchStr oldDesc))
          (setq found (vl-string-search (strcase searchStr) (strcase oldDesc)))
        )
        
        (if found
          (progn
            ;; 执行字符串替换(区分大小写版本)
            (if caseSensitive
              (setq newDesc (vl-string-subst replaceStr searchStr oldDesc))
              ;; 不区分大小写版本需要更复杂的处理
              (progn
                (setq tempDesc oldDesc)
                (setq searchLower (strcase searchStr))
                (setq oldLower (strcase oldDesc))
                
                ;; 循环替换所有出现的位置
                (while (setq pos (vl-string-search searchLower oldLower))
                  (setq tempDesc (strcat (substr tempDesc 1 pos) 
                                        replaceStr 
                                        (substr tempDesc (+ pos 1 (strlen searchStr)))))
                  (setq oldLower (strcat (substr oldLower 1 pos) 
                                        (strcase replaceStr)
                                        (substr oldLower (+ pos 1 (strlen searchStr)))))
                )
                (setq newDesc tempDesc)
              )
            )
            
            ;; 更新点的原始描述
            (vlax-put-property pointObj 'RawDescription newDesc)
            
            (setq count (1+ count))
            (princ (strcat "\n点 " (itoa (1+ i)) " 描述已更新: " newDesc))
          )
          (princ (strcat "\n点 " (itoa (1+ i)) " 未包含搜索字符串"))
        )
      )
      (princ (strcat "\n点 " (itoa (1+ i)) " 描述为空"))
    )
    
    (setq i (1+ i))
  )
  
  (princ (strcat "\n\n操作完成! 共处理了 " (itoa count) " 个点的描述。"))
  (princ)
)

;;; 加载提示信息
(princ "\n几何空间点描述替换工具已加载。")
(princ "\n命令: ReplacePointDesc - 基本版本")
(princ "\n命令: ReplacePointDescEx - 增强版本(支持大小写不敏感)")
(princ)

 

posted @ 2026-04-01 08:59  david96007  阅读(17)  评论(0)    收藏  举报