本帖最后由 null. 于 2025-2-21 13:58 编辑
用于天正T3文字中西文断裂的文字合并,不影响原有段落。
 - (defun c:TT3 (/ ss TextEntlist TextHigh TextEntlistNew currentEnt currentCenter otherEnt otherCenter dist mergedText)
- ; 步骤1: 用ssget选中TEXT文字集合,得到ss选择集
- (setq ss (ssget '((0 . "TEXT"))))
- (if ss
- (progn
- ; 步骤2: 构建实体列表并统计字高频率
- (setq TextEntlist '() freqTable '() maxCount 0 TextHigh 0)
- (repeat (setq i (sslength ss))
- (setq ent (ssname ss (setq i (1- i))))
- (setq entData (entget ent))
- ; 提取基点、字高、文字内容
- (setq pt (cdr (assoc 10 entData))
- hgt (cdr (assoc 40 entData))
- txt (cdr (assoc 1 entData)))
- ; 更新字高频率表
- (if (setq entry (assoc hgt freqTable))
- (setq freqTable (subst (cons hgt (1+ (cdr entry))) entry freqTable))
- (setq freqTable (cons (cons hgt 1) freqTable))
- )
- ; 构建排序列表
- (setq TextEntlist (cons (list ent pt txt hgt) TextEntlist))
- )
- ; 确定最高频字高
- (foreach entry freqTable
- (if (> (cdr entry) maxCount)
- (setq maxCount (cdr entry) TextHigh (car entry))
- )
- )
- (setq TextHigh (* TextHigh 0.7)) ; 缩小0.7倍
-
- ; 循环处理TextEntlist
- (while TextEntlist
- (setq TextEntlistNew '())
- (setq currentEnt (car TextEntlist))
- (setq currentCenter (cadr currentEnt))
- (setq TextEntlist (cdr TextEntlist))
- (setq TextEntlistNew (cons currentEnt TextEntlistNew))
- ; 步骤3: 比较中心点Y坐标距离
- (foreach otherEnt TextEntlist
- (setq otherCenter (cadr otherEnt))
- (setq dist (abs (- (cadr currentCenter) (cadr otherCenter))))
- (if (< dist TextHigh)
- (progn
- (setq TextEntlistNew (cons otherEnt TextEntlistNew))
- (setq TextEntlist (vl-remove otherEnt TextEntlist))
- )
- )
- )
- ; 步骤4: 将TextEntlistNew按文字基点从左到右的文字连接图元文字
- (setq TextEntlistNew (vl-sort TextEntlistNew '(lambda (a b) (< (car (cadr a)) (car (cadr b))))))
- (setq mergedText "" currentobj nil)
- (foreach ent TextEntlistNew
- (if (null currentobj)(setq currentobj (vla-Copy (<span style="background-color: rgb(255, 255, 255);">vlax-ename->vla-object</span> (car ent)))))
- (setq mergedText (strcat mergedText (caddr ent)))
- )
- (foreach ent TextEntlistNew
- (entdel (car ent))
- )
- (vla-put-TextString currentobj mergedText )
- ; 合并后的文字
- (vla-put-TextString currentobj mergedText )
-
- )
- )
- )
- (princ)
- )
附件的内容和这个码是一样的。
|