百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

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简介...

Docker安装MS SQL Server并使用Navicat远程连接

...

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来加载第三方库,并且使用了异步...

取消回复欢迎 发表评论: