乐于分享
好东西不私藏

CAD插件每周挑战—快速曲线交点布块(命令:KSJDBK)

CAD插件每周挑战—快速曲线交点布块(命令:KSJDBK)

🚀【CAD神器】一键批量插入图块!自动对齐法线+自定义角度,效率提升10倍!

还在手动复制、旋转、对齐图块?这款自研LISP插件,支持批量选择相交线,自动计算交点并沿法线方向插入图块,更可自定义旋转角度,让繁琐的绘图工作瞬间自动化!


在AutoCAD绘图过程中,你是否遇到过这样的崩溃时刻:

😩 需要在一条主管线与几十条支线的交点处,批量插入阀门、仪表或连接件图块?😩 每个图块不仅要精确定位,还要垂直于主管线(法线方向)?😩 如果主管线是斜的,或者图块需要额外旋转90度/180度,手动操作简直是把“搬砖”进行到底…

手动一个个 INSERT -> ROTATE -> ALIGN?太慢了!

今天,为大家分享一款独家定制的AutoCAD LISP插件——INSNORM。它不仅能自动寻找交点,还能智能计算法线方向,更支持批量处理角度自定义,让你的绘图效率原地起飞!🛫

一、插件核心功能 💡

这款插件专为解决“线性交点批量布块”痛点而生,核心亮点如下:

  1. 🎯 智能交点捕捉无需手动捕捉,程序自动计算基准线与多条相交线的数学交点,精度达到浮点数级别,杜绝人为误差。

  2. 📐 自动法线对齐无论基准线是水平、垂直还是任意角度的斜线(甚至圆弧、样条曲线),插入的图块都会自动垂直于基准线切线方向

  3. ⚡ 批量极速处理告别逐个点击!第二次选择时,支持框选多条相交线。一次操作,即可完成数十个甚至上百个图块的插入。

  4. 🔄 角度自由定制内置角度偏移功能。在基础法线方向上,可随意输入 90180-45 等角度,满足不同图块朝向需求,并自动记忆上次设置。


二、插件使用场景 🏗️

这款插件适用于所有需要在“线与线交点”处标准化布置图块的场景:

  • 暖通/给排水设计:在主干管与支管交点处,批量插入阀门、流量计、三通接头
  • 电气布线:在线路交叉点或分支点,快速布置接线盒、灯具、开关符号
  • 道路/土木工程:在道路中心线与桩号线的交点,插入路灯、里程桩、绿化树木
  • 机械装配:在轴系与孔系的交点,批量安装轴承、密封圈、紧固件
  • 桥梁工程:下部结构根据曲线排布。

💡 效率对比:

  • 传统方式:插入1个图块需30秒(定位+旋转+对齐),50个图块需 25分钟
  • 使用INSNORM:全程操作仅需 1分钟,效率提升 25倍

三、插件使用注意事项 ⚠️

为了获得最佳体验,使用前请留意以下几点:

1、图块要求

  • 请选择一个已定义好插入基点的图块作为参考。如果图块基点在角落,插入后位置可能会偏,建议先将图块基点修改为中心或连接点(使用 BASE 命令)。
  • 支持动态块,但插入后将采用该动态块的默认状态。
2、线条类型
  • 基准线和相交线支持:直线 (LINE)、多段线 (LWPOLYLINE)、圆 (CIRCLE)、圆弧 (ARC)、样条曲线 (SPLINE)。
  • 注意
    :如果两条线在视觉上相交但实际上未延伸接触,且未开启“延伸相交”模式,可能无法检测到交点(当前版本默认为实际几何交点)。
3、角度方向
  • 法线有两个方向(正向90°或反向270°)。如果插入后发现图块“倒立”了,只需在角度设置步骤输入180 即可瞬间修正。
4、坐标系
  • 插件主要在当前用户坐标系(UCS)的XY平面内工作。请确保您的绘图处于二维平面状态。

四、插件使用方法 🛠️

1. 安装步骤

  1. 打开AutoCAD,输入命令 APPLOAD
  2. 选择保存的 插件文件并点击“加载”。
  3. 看到提示 加载成功!请输入命令 [KSJDBK] 即表示安装完成。

2. 操作流程

在命令行输入 KSJDBK 并回车,按提示操作:

  • 第一步:选图块

    1. 请选择参考图块:👉 鼠标点击图中已有的一个标准图块。

  • 第二步:选基准线

    2. 请选择基准线 (用于确定法线方向):👉 点击那条“主干”线(图块将垂直于它)。

  • 第三步:设角度(核心!)

    3. 输入相对于法线的旋转偏移角度 <0.00>:👉 直接回车:使用默认方向(法线方向)。👉 输入 90:图块在法线基础上再转90度。👉 输入 180:图块掉头(解决方向反了的问题)。注:系统会记住你上次输入的数值,下次直接用回车即可。

  • 第四步:选相交线(批量!)

    4. 请选择与基准线相交的线 (可多选,支持框选):👉 使用鼠标框选所有需要生成图块的支线(可以选几十条!)。

  • 完成!

    命令行显示:完成!共在 XX 个交点处插入图块。🎉 见证奇迹的时刻,所有图块已整齐排列!

已关注

关注

重播 分享


五、延伸及自定义修改 🔧

本插件开源共享,如果您懂一点LISP语言,可以轻松进行个性化改造:

1. 修改默认角度

如果你发现每次都需要输入180才能对正,可以修改源码中的初始变量:找到代码顶部的:

(if (not *INSNORM_LAST_ANGLE*)  (setq *INSNORM_LAST_ANGLE* 0.0) ;; 将 0.0 改为 180.0)

这样每次启动默认就是180度偏移。

2. 改变基础法线方向

如果图块的基础方向(输入0度时)总是反的,可以修改核心计算逻辑。找到代码中的:

(setq angBase (- angTan (/ pi 2.0))) ;; 当前是 切线 - 90
改为:
(setq angBase (+ angTan (/ pi 2.0))) ;; 改为 切线 + 90

这将翻转基础法线的朝向。

3. 扩展功能

  • 自动过滤图层
    :可以在 ssget 函数中增加图层过滤,只选择特定图层上的线条。
  • 自动添加属性
    :在插入图块后,利用 vla-puttextstring 自动填写编号或坐标信息。

六、插件测试环境:CAD2016及以上版本

七、插件名字:KSJDBK.LSP

八、插件代码:

;; ============================================================================;; 命令: KSJDBK;; 功能: ;;   1. 选择参考图块;;   2. 选择基准线 (计算法线);;   3可选输入旋转偏移角度 (默认0,可输入90180-90等);;   4多选选择多条相交线;;   5. 在所有交点插入图块,角度 = 法线角度 + 用户设定的偏移角;; 适用: AutoCAD 2016+;; ============================================================================(vl-load-com);; 定义全局变量存储上次输入的角度,方便下次调用(if (not *INSNORM_LAST_ANGLE*)  (setq *INSNORM_LAST_ANGLE* 0.0))(defun c:KSJDBK (/ ssBlock entBlock objBlock blkName blkScaleX blkScaleY blkScaleZ                  entLine1 objLine1 ssLines i entLine2 objLine2                   ptInt param tanVec angTan angBase angOffset angIns                   oldOsmap spaceObj ptIns newObj strInput angInput)  (princ "\n=== 图块法向插入插件 (带角度偏移) ===")  ;; 1. 选择参考图块  (princ "\n1. 请选择参考图块: ")  (setq ssBlock (ssget "_:S" '((0 . "INSERT"))))  (if (not ssBlock)    (progn (princ "\n未选择图块,命令取消。") (exit))  )  (setq entBlock (ssname ssBlock 0))  (setq objBlock (vlax-ename->vla-object entBlock))  ;; 获取图块属性  (setq blkName (vla-get-EffectiveName objBlock))  (setq blkScaleX (vla-get-XScaleFactor objBlock))  (setq blkScaleY (vla-get-YScaleFactor objBlock))  (setq blkScaleZ (vla-get-ZScaleFactor objBlock))  ;; 2. 选择基准线  (princ "\n2. 请选择基准线 (用于确定法线方向): ")  (setq entLine1 (car (entsel)))  (if (not entLine1)    (progn (princ "\n未选择基准线,命令取消。") (exit))  )  (setq objLine1 (vlax-ename->vla-object entLine1))  ;; 3新增设置角度偏移  ;; 提示用户输入角度,默认值为上次输入的值  (setq strInput (getstring (strcat "\n3. 输入相对于法线的旋转偏移角度(默认0,可输入90, 180, -90等) <" (rtos *INSNORM_LAST_ANGLE* 2 2">: ")))  (if (or (null strInput) (= strInput ""))    ;; 用户直接回车,使用上次的值    (setq angOffset *INSNORM_LAST_ANGLE*)    ;; 用户输入了新值,尝试转换为数字    (progn      (setq angInput (distof strInput 2)) ;; 2 表示十进制格式      (if (null angInput)        (progn          (princ "\n输入无效,将使用 0 度。")          (setq angOffset 0.0)        )        (setq angOffset angInput)      )    )  )  ;; 更新全局变量供下次使用  (setq *INSNORM_LAST_ANGLE* angOffset)  (princ (strcat "   -> 设定偏移角度: " (rtos angOffset 2 2" 度"))  ;; 将角度转换为弧度 (CAD内部使用弧度)  (setq angOffsetRad (* angOffset (/ pi 180.0)))  ;; 4. 选择相交线 (支持多选)  (princ "\n4. 请选择与基准线相交的线 (可多选,支持框选): ")  (setq ssLines (ssget '((0 . "LINE,LWPOLYLINE,CIRCLE,ARC,SPLINE"))))  (if (not ssLines)    (progn (princ "\n未选择相交线,命令取消。") (exit))  )  ;; 关闭对象捕捉  (setq oldOsmap (getvar "OSMODE"))  (setvar "OSMODE" 0)  (setq spaceObj (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))))  (setq i 0)  (setq count 0)  ;; 遍历所有选中的相交线  (repeat (sslength ssLines)    (setq entLine2 (ssname ssLines i))    ;; 跳过基准线自身    (if (/= entLine2 entLine1)      (progn        (setq objLine2 (vlax-ename->vla-object entLine2))        ;; 计算交点        (setq varInt (vlax-invoke-method objLine1 'IntersectWith objLine2 acExtendNone))        ;; 检查是否有有效交点        (if (and varInt                  (= (type varInt) 'VARIANT)                 (> (vlax-safearray-get-u-bound (vlax-variant-value varInt) 1-1))          (progn            ;; 获取交点坐标            (setq ptInt (vlax-safearray->list (vlax-variant-value varInt)))            ;; --- 核心角度计算 ---            ;; 1. 获取基准线在交点处的切线角度            (setq param (vlax-curve-getParamAtPoint objLine1 ptInt))            (setq tanVec (vlax-curve-getFirstDeriv objLine1 param))            (setq angTan (angle '(0 0 0) tanVec))            ;; 2. 计算基础法线角度 (切线 - 90度)            ;; 注意:这里保持之前的逻辑,如果您发现基础方向反了,可以改为 + (/ pi 2.0)            (setq angBase (- angTan (/ pi 2.0)))            ;; 3. 应用用户设定的偏移角度            (setq angIns (+ angBase angOffsetRad))            ;; 插入图块            (setq ptIns (vlax-3d-point ptInt))            (setq newObj (vla-insertBlock spaceObj ptIns blkName blkScaleX blkScaleY blkScaleZ angIns))            (setq count (1+ count))          )        )      )    )    (setq i (1+ i))  )  ;; 恢复系统变量  (setvar "OSMODE" oldOsmap)  (princ (strcat "\n完成!共在 " (itoa count) " 个交点处插入图块 (偏移: " (rtos angOffset 2 2"°)。"))  (princ));; 加载提示(princ "\n加载成功!请输入命令 [KSJDBK] 开始使用。")(princ)

九、插件下载

链接: https://pan.baidu.com/s/1klzlH80dMqZGYmlQo1nQ8w

提取码: GMXY