AI助力AUTOCAD,生成LSP插件(ai里面cad插件怎么使用)
ztj100 2025-05-08 22:30 4 浏览 0 评论
以下是用AI生成的,用AUTOLISP语言编写的cad插件,分享给大家:
一、将单线偏移为双线
;;;;;;;;;;;;;;;;;;;;;;单线变双线
(defun c:x2 (/ ss vss dist)
(vl-load-com)
(princ "\n单线变双线 \n选择要变双的曲线:")
(setq ss (ssget '((0 . "Arc,Circle,Ellipse,Line,LwPolyline,Polyline,Spline,XLine")) )
vss (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))
dist (getdist "\n输入双线距离:"))
(vlax-for obj vss (vla-offset obj (* 0.5 dist))(vla-offset obj (* -0.5 dist)))
(command "erase" ss"" )
)
二、将单线偏移为三线(原来的线改为中心线)
;;;;;;;;;;;单线变3线
(defun c:x3 (/ *error* ss dist i ent obj entType)
(defun *error* (msg)
(princ "\n错误: ")
(princ msg)
(princ)
)
(if (setq ss (ssget))
(progn
(setq dist (getreal "\n单线变3线,输入距离: "))
(if (not dist)
(progn (princ "\n未输入距离。") (exit))
)
; 确保CENTER线型已加载
(if (not (tblsearch "LTYPE" "CENTER"))
(command "_.LINETYPE" "L" "CENTER" "acad.lin" "")
)
(repeat (setq i (sslength ss))
(setq ent (ssname ss (setq i (1- i))))
(setq obj (vlax-ename->vla-object ent))
(setq entType (vla-get-objectname obj))
(cond
((= entType "AcDbLine")
(OffsetLine ent dist)
)
((= entType "AcDbCircle")
(OffsetCircle ent dist)
)
((= entType "AcDbArc")
(OffsetArc ent dist)
)
((wcmatch entType "*Polyline")
(OffsetPolyline ent dist)
)
(t
(princ (strcat "\n不支持的图元类型: " entType))
)
)
; 修改原图元为中心线
(vla-put-linetype obj "CENTER")
(vla-put-Lineweight obj acLnWtByLwDefault)
(vla-update obj)
)
)
)
(princ)
)
(defun OffsetLine (ent dist / obj start end dx dy len nx ny offDist)
(setq obj (vlax-ename->vla-object ent))
(setq start (vlax-get obj 'StartPoint))
(setq end (vlax-get obj 'EndPoint))
(setq dx (- (car end) (car start)))
(setq dy (- (cadr end) (cadr start)))
(setq len (sqrt (+ (* dx dx) (* dy dy))))
(if (> len 1e-6)
(progn
(setq nx (/ (- dy) len))
(setq ny (/ dx len))
(setq offDist (* 0.5 dist))
; 创建两侧偏移线
(CreateOffsetLine start end nx ny offDist)
(CreateOffsetLine start end (- nx) (- ny) offDist)
)
)
)
(defun CreateOffsetLine (pt1 pt2 nx ny dist / p1 p2)
(setq p1 (list (+ (car pt1) (* nx dist)) (+ (cadr pt1) (* ny dist)) (caddr pt1)))
(setq p2 (list (+ (car pt2) (* nx dist)) (+ (cadr pt2) (* ny dist)) (caddr pt2)))
(entmakex (list '(0 . "LINE") (cons 10 p1) (cons 11 p2)))
)
(defun OffsetCircle (ent dist / obj cen r r1 r2)
(setq obj (vlax-ename->vla-object ent))
(setq cen (vlax-get obj 'Center))
(setq r (vla-get-Radius obj))
(setq r1 (+ r (* 0.5 dist)))
(if (> r1 0)
(entmakex (list '(0 . "CIRCLE") (cons 10 cen) (cons 40 r1)))
)
(setq r2 (- r (* 0.5 dist)))
(if (> r2 0)
(entmakex (list '(0 . "CIRCLE") (cons 10 cen) (cons 40 r2)))
)
)
(defun OffsetArc (ent dist / obj cen r sa ea r1 r2)
(setq obj (vlax-ename->vla-object ent))
(setq cen (vlax-get obj 'Center))
(setq r (vla-get-Radius obj))
(setq sa (vla-get-StartAngle obj))
(setq ea (vla-get-EndAngle obj))
(setq r1 (+ r (* 0.5 dist)))
(if (> r1 0)
(entmakex (list '(0 . "ARC") (cons 10 cen) (cons 40 r1) (cons 50 sa) (cons 51 ea)))
)
(setq r2 (- r (* 0.5 dist)))
(if (> r2 0)
(entmakex (list '(0 . "ARC") (cons 10 cen) (cons 40 r2) (cons 50 sa) (cons 51 ea)))
)
)
(defun OffsetPolyline (ent dist / obj)
(setq obj (vlax-ename->vla-object ent))
(vl-catch-all-apply 'vla-Offset (list obj (* 0.5 dist)))
(vl-catch-all-apply 'vla-Offset (list obj (* -0.5 dist)))
)
三、单线变多线
;;;;;;;;线变多线
(defun c:xbd (/ ent line startPt endPt mstyle dist)
; 获取用户选择的直线
(setq ent (car (entsel "\n选择一条直线: ")))
(if (not ent)
(progn
(alert "未选择对象或选择无效!")
(exit)
)
)
; 验证选择的是直线
(if (/= "LINE" (cdr (assoc 0 (entget ent))))
(progn
(alert "所选对象不是直线!")
(exit)
)
)
; 获取直线的起点和终点
(setq line (entget ent))
(setq startPt (cdr (assoc 10 line)))
(setq endPt (cdr (assoc 11 line)))
; 获取用户输入的多线样式和距离
(setq mstyle (getstring "\n输入多线样式名称: "))
(setq dist (getdist "\n输入距离: "))
(entdel ent)
(command "MLINE"
"ST" mstyle ; 多线样式
"J" "Z" ; 对正方式为Z(无)
"S" dist ; 比例(距离)
startPt ; 起点
endPt ; 终点
"" ; 结束命令
)
(princ)
)
四、统计线总长度
;;;;;;;;;;;线总长
(defun c:XZC (/ ss total len ent i)
(vl-load-com) ; 加载Visual LISP扩展
(setq total 0.0)
(if (setq ss (ssget '((0 . "LINE,ARC,CIRCLE,LWPOLYLINE,POLYLINE,SPLINE,ELLIPSE"))))
(progn
(repeat (setq i (sslength ss))
(setq ent (ssname ss (setq i (1- i))))
(setq len (vl-catch-all-apply 'vlax-curve-getDistAtParam (list ent (vlax-curve-getEndParam ent))))
(if (not (vl-catch-all-error-p len))
(setq total (+ total len))
(princ (strcat "\n警告: 无法计算图元 " (cdr (assoc 5 (entget ent))) " 的长度"))
)
)
(princ (strcat "\n总长度: " (rtos total) " 单位"))
)
(princ "\n未选择对象")
)
(princ)
)
五、给竖直轴线编数字号
;;;;;;;;;;;;; 轴线编号123
(defun c:ZX1 (/ ss p1 p2 distHeight points sorted num ent start end pt ins txt)
(vl-load-com)
(if (setq ss (ssget '((0 . "LINE")))) ; 仅选择直线对象
(progn
;;; 获取文字高度和圆圈半径
(if (and (setq p1 (getpoint "\n指定文字高度基准点: "))
(setq p2 (getpoint p1 "\n指定文字高度目标点: ")))
(progn
(setq distHeight (distance p1 p2)) ; 两点距离作为文字高度
(setq rad (* 0.8 distHeight)) ; 圆圈半径=文字高度×0.8
;;; 收集所有线段下端点
(setq points nil)
(setq i 0)
(repeat (sslength ss)
(setq ent (ssname ss i))
(setq start (vlax-curve-getStartPoint ent))
(setq end (vlax-curve-getEndPoint ent))
; 比较Y坐标取下方端点
(if (< (cadr start) (cadr end))
(setq pt (list (car start) (cadr start)))
(setq pt (list (car end) (cadr end)))
)
(setq points (cons pt points))
(setq i (1+ i))
)
;;; 按X坐标排序点列表
(setq sorted (vl-sort points '(lambda (a b) (< (car a) (car b)))))
;;; 创建编号和圆圈
(setq num 1)
(foreach pt sorted
; 计算插入点(下端点下方偏移1倍文字高度)
(setq ins (list (car pt) (- (cadr pt) (* 1 distHeight)) 0.0))
; 创建中间对齐文字
(command "_.TEXT" "_J" "_MC" ins distHeight 0 (itoa num))
; 创建圆圈
(command "_.CIRCLE" ins rad)
(setq num (1+ num))
)
)
(princ "n未指定有效距离!")
)
)
(princ "\n未选择线段!")
)
(princ)
)
六、计算选择对象与输入数值的差值
;;算差值(选择对象与输入数值的差)
(defun c:scz (/ ent entType obj dimValue entLength userValue difference)
;; 提示用户选择一个对象
(setq ent (car (entsel "\n请选择一个尺寸标注或图元: ")))
(if ent
(progn
;; 获取对象的类型
(setq entType (cdr (assoc 0 (entget ent))))
(cond
;; 如果选择的是尺寸标注
((= entType "DIMENSION")
(setq obj (vlax-ename->vla-object ent))
(setq dimValue (vla-get-Measurement obj))
(princ (strcat "\n选择的尺寸标注值为: " (rtos dimValue)))
)
;; 如果选择的是图元
((= entType "LINE") ;; 这里假设选择的是直线,可以根据需要扩展其他图元类型
(setq obj (vlax-ename->vla-object ent))
(setq entLength (vla-get-Length obj))
(princ (strcat "\n选择的图元长度为: " (rtos entLength)))
)
;; 如果选择的对象不是尺寸标注或图元
(t
(setq entLength (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam ent)))
)
)
;; 提示用户输入一个数值
(setq userValue (getreal "\n请输入一个数值: "))
;; 计算差值
(if dimValue
(setq difference (- dimValue userValue))
(setq difference (- entLength userValue))
)
;; 输出差值
(princ (strcat "\n差值为: " (rtos difference)))
)
(princ "\n未选择任何对象。")
)
(princ)
)
七、统计选择的块在图中的总数量
;;统计块数量
(defun c:ksl (/ blkname ss count)
;; 提示用户选择一个图块
(setq blkname (car (entsel "\n请选择一个图块: ")))
;; 检查选择的对象是否为图块
(if (and blkname (eq (cdr (assoc 0 (entget blkname))) "INSERT"))
(progn
;; 获取图块名称
(setq blkname (cdr (assoc 2 (entget blkname))))
;; 选择整个图中的所有该图块
(setq ss (ssget "X" (list (cons 2 blkname))))
;; 统计图块数量
(if ss
(progn
(setq count (sslength ss))
(princ (strcat "\n图块 '" blkname "' 的数量为: " (itoa count)))
)
(princ "\n未找到该图块。")
)
)
(princ "\n选择的对象不是图块。")
)
(princ)
)
八、数字递增
;;;;;;;;数递增
(defun c:sdz (/ ent txt newtxt pt)
(setq ent (car (entsel "\n选择单行文字: "))) ; 选择单行文字
(if ent
(progn
(setq txt (cdr (assoc 1 (entget ent)))) ; 获取文字内容
(setq newtxt "")
(setq i 0)
(while (< i (strlen txt))
(setq char (substr txt (1+ i) 1))
(if (and (>= char "0") (<= char "9")) ; 判断是否为数字
(setq newtxt (strcat newtxt (itoa (1+ (atoi char))))) ; 数字加1
(setq newtxt (strcat newtxt char)) ; 非数字保持不变
)
(setq i (1+ i))
)
(setq pt (getpoint "\n指定新的放置位置: ")) ; 获取新的放置位置
(entmake (list '(0 . "TEXT")
(cons 10 pt)
(cons 1 newtxt)
(assoc 40 (entget ent)) ; 保持原文字高度
(assoc 7 (entget ent)) ; 保持原文字样式
(assoc 8 (entget ent)) ; 保持原图层
))
)
)
(princ)
)
九、线合并为多段线
;;;;;;;;;;线合并
(defun c:xhb (/ ss lines fuzz)
;; 设置模糊距离
(setq fuzz 1.0)
;; 选择图元
(prompt "\n选择要合并的线: ")
(setq ss (ssget '((0 . "Arc,Circle,Ellipse,Line,LwPolyline,Polyline,Spline,XLine"))))
;; 检查是否选择了图元
(if ss
(progn
;; 将选中的线转换为多段线
(command "_.PEDIT" "_M" ss "" "_Y" "_J" fuzz "")
(princ "\n线已合并为多段线。")
)
(princ "\n未选择任何线。")
)
(princ)
)
十、将选择的图元图层改为0层,标高改为0,线型、线宽为BYLAYER
;;;;;;;;;;;; 强制设置图层为0
(defun c:0 (/ ss i ent ent_data ent_type)
(setq ss (ssget '((0 . "LINE,CIRCLE,ARC,LWPOLYLINE"))))
(if ss
(progn
(setq i 0)
(repeat (sslength ss)
(setq ent (ssname ss i))
(setq ent_data (entget ent))
(setq ent_type (cdr (assoc 0 ent_data)))
;;-- 通用属性修改 --;;
;; 强制设置图层为0
(if (assoc 8 ent_data)
(setq ent_data (subst (cons 8 "0") (assoc 8 ent_data) ent_data))
(setq ent_data (cons (cons 8 "0") ent_data))
)
;; 强制设置线型为BYLAYER
(if (assoc 6 ent_data)
(setq ent_data (subst (cons 6 "BYLAYER") (assoc 6 ent_data) ent_data))
(setq ent_data (cons (cons 6 "BYLAYER") ent_data))
)
;; 强制设置线宽为BYLAYER
(if (assoc 370 ent_data)
(setq ent_data (subst (cons 370 -1) (assoc 370 ent_data) ent_data))
(setq ent_data (cons (cons 370 -1) ent_data))
)
;;-- 标高处理 --;;
(cond
;; 处理直线
((= ent_type "LINE")
(foreach code '(10 11) ; 同时处理起点和终点
(if (setq pt (assoc code ent_data))
(setq ent_data
(subst
(cons code (list (car (cdr pt)) (cadr (cdr pt)) 0.0))
pt
ent_data
)
)
)
)
)
;; 处理圆/圆弧
((member ent_type '("CIRCLE" "ARC"))
(if (setq pt (assoc 10 ent_data))
(setq ent_data
(subst
(cons 10 (list (car (cdr pt)) (cadr (cdr pt)) 0.0))
pt
ent_data
)
)
)
)
;; 处理多段线(LWPOLYLINE)
((= ent_type "LWPOLYLINE")
(if (assoc 38 ent_data)
(setq ent_data (subst (cons 38 0.0) (assoc 38 ent_data) ent_data))
(setq ent_data (cons (cons 38 0.0) ent_data))
)
)
) ; end cond
;; 提交修改
(if (entmod ent_data)
(entupd ent)
(princ (strcat "\n警告: 对象 " (cdr (assoc 5 ent_data)) " 修改失败"))
)
(setq i (1+ i))
)
)
(princ "\n未选择对象")
)
(princ)
)
十一、只选择图形,不选择尺寸
;;;;;;;;;;;; 选图形
(defun c:xtx (/ ss)
(setq ss (ssget '((0 . "LINE,MLINE,CIRCLE,ARC,LWPOLYLINE,POLYLINE,SPLINE,INSERT"))))
(princ)
)
十二、将图中所有尺寸的图层修改为当前图层
;;;;;;;;;;;;尺寸图层
(defun c:cctc (/ ss)
(princ "\n选择所有尺寸标注并改为当前图层...")
(if (setq ss (ssget "_X" '((0 . "DIMENSION,LEADER,*DIM*"))))
(progn
(command "._chprop" ss "" "_la" (getvar "clayer") "")
(princ (strcat "\n已更改 " (itoa (sslength ss)) " 个尺寸标注到当前图层。"))
)
(princ "\n未找到尺寸标注。")
)
(princ)
)
相关推荐
- 利用navicat将postgresql转为mysql
-
导航"拿来主义"吃得亏自己动手,丰衣足食...
- Navicat的详细教程「偷偷收藏」(navicatlite)
-
Navicat是一套快速、可靠并价格适宜的数据库管理工具,适用于三种平台:Windows、macOS及Linux。可以用来对本机或远程的MySQL、SQLServer、SQLite、...
- Linux系统安装SQL Server数据库(linux安装数据库命令)
-
一、官方说明...
- Navicat推出免费数据库管理软件Premium Lite
-
IT之家6月26日消息,Navicat推出一款免费的数据库管理开发工具——NavicatPremiumLite,针对入门级用户,支持基础的数据库管理和协同合作功能。▲Navicat...
- Docker安装部署Oracle/Sql Server
-
一、Docker安装Oracle12cOracle简介...
- Web性能的计算方式与优化方案(二)
-
通过前面《...
- 网络入侵检测系统之Suricata(十四)——匹配流程
-
其实规则的匹配流程和加载流程是强相关的,你如何组织规则那么就会采用该种数据结构去匹配,例如你用radixtree组织海量ip规则,那么匹配的时候也是采用bittest确定前缀节点,然后逐一左右子树...
- 使用deepseek写一个图片转换代码(deepnode处理图片)
-
写一个photoshop代码,要求:可以将文件夹里面的图片都处理成CMYK模式。软件版本:photoshop2022,然后生成的代码如下://Photoshop2022CMYK批量转换专业版脚...
- AI助力AUTOCAD,生成LSP插件(ai里面cad插件怎么使用)
-
以下是用AI生成的,用AUTOLISP语言编写的cad插件,分享给大家:一、将单线偏移为双线;;;;;;;;;;;;;;;;;;;;;;单线变双线...
- Core Audio音频基础概述(core 音乐)
-
1、CoreAudioCoreAudio提供了数字音频服务为iOS与OSX,它提供了一系列框架去处理音频....
- BlazorUI 组件库——反馈与弹层 (1)
-
组件是前端的基础。组件库也是前端框架的核心中的重点。组件库中有一个重要的板块:反馈与弹层!反馈与弹层在组件形态上,与Button、Input类等嵌入界面的组件有所不同,通常以层的形式出现。本篇文章...
- 怎样创建一个Xcode插件(xcode如何新建一个main.c)
-
译者:@yohunl译者注:原文使用的是xcode6.3.2,我翻译的时候,使用的是xcode7.2.1,经过验证,本部分中说的依然是有效的.在文中你可以学习到一系列的技能,非常值得一看.这些技能不单...
- 让SSL/TLS协议流行起来:深度解读SSL/TLS实现1
-
一前言SSL/TLS协议是网络安全通信的重要基石,本系列将简单介绍SSL/TLS协议,主要关注SSL/TLS协议的安全性,特别是SSL规范的正确实现。本系列的文章大体分为3个部分:SSL/TLS协...
- 社交软件开发6-客户端开发-ios端开发验证登陆部分
-
欢迎订阅我的头条号:一点热上一节说到,Android客户端的开发,主要是编写了,如何使用Androidstudio如何创建一个Android项目,已经使用gradle来加载第三方库,并且使用了异步...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 利用navicat将postgresql转为mysql
- Navicat的详细教程「偷偷收藏」(navicatlite)
- Linux系统安装SQL Server数据库(linux安装数据库命令)
- Navicat推出免费数据库管理软件Premium Lite
- Docker安装部署Oracle/Sql Server
- Docker安装MS SQL Server并使用Navicat远程连接
- Web性能的计算方式与优化方案(二)
- 网络入侵检测系统之Suricata(十四)——匹配流程
- 使用deepseek写一个图片转换代码(deepnode处理图片)
- AI助力AUTOCAD,生成LSP插件(ai里面cad插件怎么使用)
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- node卸载 (33)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- exceptionininitializererror (33)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)