明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 590|回复: 1

线段批量转块-平面布置

[复制链接]
发表于 2025-10-22 08:57:36 | 显示全部楼层 |阅读模式
本帖最后由 ㄘ丶转裑ㄧ灬 于 2025-11-30 14:49 编辑

一般用于平面图,把分隔线段替换为制作好的块,块会安装线段角度相应旋转;
用AI写的,两次就正常运行了,还不错;
另外大伙如果对这个功能有更多的想法,可扩展完善后发源码出来。

  1. ;;;;;;*****************************************批量布块(遵循线的角度)

  2. (defun c:HT_310 (/ blk blk_data blk_name ss i pline obj pt1 pt2 ang adjusted_ang
  3.                     insert_point vertex_choice success_count end_param)
  4.   (HT_START)
  5.   
  6.   ; 选择要插入的块(增加块类型校验)
  7.   (setq blk (car (entsel "\n选择要插入的块(竖向块): ")))
  8.   (if (not blk)
  9.     (progn (alert "未选择块!") (exit)))
  10.   
  11.   ; 验证选中的是块(INSERT类型实体)
  12.   (setq blk_data (entget blk))
  13.   (if (not (= (cdr (assoc 0 blk_data)) "INSERT"))
  14.     (progn (alert "选中的实体不是块,请重新选择!") (exit)))
  15.   (setq blk_name (cdr (assoc 2 blk_data)))
  16.   
  17.   ; 选择插入点位置
  18.   (initget "First Second")
  19.   (setq vertex_choice (getkword "\n选择插入点位置 [第一个顶点(F)/第二个顶点(S)] <第一个顶点>: "))
  20.   (setq vertex_choice (if vertex_choice vertex_choice "First")) ; 默认第一个顶点
  21.   
  22.   ; 选择多段线(支持轻量多段线和二维多段线)
  23.   (setq ss (ssget '((0 . "LWPOLYLINE,POLYLINE"))))
  24.   (if (not ss)
  25.     (progn (alert "未选择多段线!") (exit)))
  26.   
  27.   ; 初始化计数器(i=多段线索引,success_count=成功插入次数)
  28.   (setq i 0 success_count 0)
  29.   
  30.   ; 遍历所有选中的多段线(核心修复:循环逻辑修正)
  31.   (repeat (sslength ss)
  32.     (setq pline (ssname ss i))
  33.     (setq obj (vlax-ename->vla-object pline))
  34.    
  35.     ; 检查多段线顶点数(至少2个顶点才计算角度)
  36.     (setq end_param (vlax-curve-getEndParam obj))
  37.     (if (>= end_param 1) ; param从0开始,>=1表示至少2个顶点
  38.       (progn
  39.         ; 根据用户选择确定插入点和角度参考点
  40.         (cond
  41.           ((= vertex_choice "First")
  42.             (setq insert_point (vlax-curve-getStartPoint obj)) ; 插入点:第一个顶点
  43.             (setq pt2 (vlax-curve-getPointAtParam obj 1))      ; 参考点:第二个顶点
  44.           )
  45.           ((= vertex_choice "Second")
  46.             (setq insert_point (vlax-curve-getPointAtParam obj 1)) ; 插入点:第二个顶点
  47.             (setq pt2 (vlax-curve-getStartPoint obj))             ; 参考点:第一个顶点
  48.           )
  49.         )
  50.         
  51.         ; 计算多段线方向角度(弧度),调整为块需要的角度(减90°)
  52.         (setq ang (angle insert_point pt2))
  53.         (setq adjusted_ang (- ang (/ pi 2)))
  54.         (setq adjusted_ang_deg (* adjusted_ang (/ 180 pi))) ; 转为角度(AutoCAD命令要求)
  55.         
  56.         ; 插入块(使用实数角度,避免字符串格式问题)
  57.         (command "_.INSERT" blk_name insert_point 1 1 adjusted_ang_deg)
  58.         
  59.         (setq success_count (1+ success_count)) ; 成功插入计数+1
  60.       )
  61.       (progn
  62.         ; 顶点数不足提示
  63.         (princ (strcat "\n多段线" (itoa (1+ i)) "(索引" (itoa i) ")顶点数不足2个,跳过!"))
  64.       )
  65.     )
  66.    
  67.     (setq i (1+ i)) ; 每次循环仅递增1次(核心修复)
  68.   )
  69.   
  70.   ; 输出结果提示
  71.   (princ (strcat "\n批量插入完成!共处理 " (itoa (sslength ss)) " 条多段线,成功插入 " (itoa success_count) " 个块。"))
  72.   (princ "\n提示:若块方向错误,可重新运行并选择「第二个顶点(S)」作为插入点。")
  73.   (HT_END)
  74.   (princ)
  75. )



  1. ;;*************************************************************************************************************************************************
  2. ;;;
  3. ;;;>>>>>>>>>>>>>>--出错处理_HT-->>>>>>>>>>>>>>>>所用位置:HT_401、402、部分三维改造(因老顾的错误处理对部分用pause的程序不起作用,有的又可以,奇怪)
  4. ;;(HT_START)
  5. ;;(HT_END)

  6. (defun HT_START ()
  7.   (vl-load-com)
  8.     (defun error_new (msg)
  9.       (if os_old (setvar "osmode" os_old))
  10.       (if cmd_old (setvar "cmdecho" cmd_old))
  11.       (if DYN1_old (setvar "DYNmode" DYN1_old))
  12.       (if DYN2_old (setvar "DYNprompt" DYN2_old))
  13.       (if DEL_old (setvar "DELobj" DEL_old))
  14.       (if SUB_old (setvar "SUBobjSELECTionmode" SUB_old))
  15.       (if CUL_old (setvar "CULlingOBJselection" CUL_old))
  16.       (if error_old (setq *error* error_old))      
  17.       (if (wcmatch (strcase msg t) "*break,*cancel*,*exit*,*取消*")
  18.         (redraw)
  19.       )
  20.       (while (/= 0 (getvar "cmdactive"))(command ""))
  21.       (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  22.       (prompt "*程序错误或用户按ESC取消*")
  23.       (princ)
  24.     )
  25.   (vla-startUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  26.   (setq error_old *error*)   
  27.   (setq *error* error_new)
  28.   (setq os_old (getvar "osmode"))
  29.   (setq cmd_old (getvar "cmdecho"))
  30.   (setq DYN1_old (getvar "DYNmode"))
  31.   (setq DYN2_old (getvar "DYNprompt"))
  32.   (setq DEL_old (getvar "DELobj"))
  33.   (cond ((>= (atof (getvar "ACADVER")) 18.2 );;判断CAD版本是否大于2012
  34.       (setq SUB_old (getvar "SUBobjSELECTionmode"));;过滤选择
  35.       (setq CUL_old (getvar "CULlingOBJselection"));;是否可选隐藏对象
  36.       )
  37.   )
  38. )

  39. (defun HT_END ()
  40.   (if os_old (setvar "osmode" os_old))
  41.   (if cmd_old (setvar "cmdecho" cmd_old))
  42.   (if DYN1_old (setvar "DYNmode" DYN1_old))
  43.   (if DYN2_old (setvar "DYNprompt" DYN2_old))
  44.   (if DEL_old (setvar "DELobj" DEL_old))
  45.   (if SUB_old (setvar "SUBobjSELECTionmode" SUB_old))
  46.   (if CUL_old (setvar "CULlingOBJselection" CUL_old))
  47.   (if error_old (setq *error* error_old))
  48.   (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  49.   ;(vlax-invoke Scriptshell "SendKeys" "+^1") ;启用英文输入法
  50. )

回复

使用道具 举报

发表于 2025-10-22 09:03:48 | 显示全部楼层
谢谢分享  
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-23 03:31 , Processed in 0.192082 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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