明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1103|回复: 7

[资源] PL线上,批量插入不同长度的长方形块

[复制链接]
发表于 2023-4-10 14:42:20 | 显示全部楼层 |阅读模式
大神帮看看:
    在PL线上,根据PL线长度,批量插入不同长度的长方形块,长方形块长分别有2米,1米,0.6米,0.1米;宽度都是0.5米。插入规则优先使用长度较长的块,且布置满PL线。插入位置为长方形块的宽边中点都在PL线上。PL线可以是直线,也可以是封闭的折线。

    以下为代码:
(defun c:tt (/ plen blist)
  (setq plen (getdist "\nEnter the length of the polyline: "))
  (setq blist '((2000 . "2m block") (1000 . "1m block") (600 . "0.6m block") (100 . "0.1m block")))
  (setq blist (reverse (sort blist (lambda (x y) (< (car x) (car y)))))) ;按长度从小到大排序
  (setq i 0)
  (while (> plen 0)
    (setq l (car (nth i blist)))
    (setq pt1 (vlax-curve-getFirstPoint (setq pl (car (entsel "\nSelect polyline: ")))))
    (setq pt2 (vlax-curve-getPointAtDist pl (setq plen (- plen l)))))
    (setq mp (polar pt1 (angle pt1 pt2) (/ l 2.0)))
    (setq blk (cdr (nth i blist)))
    (setq rot (angle pt1 pt2))
    (command "_.insert" blk mp 1.0 1.0 (/ l 2.0) "_.rotate" mp rot)
    (setq i (mod (1+ i) 4)))
  )


发表于 2023-4-10 16:17:10 | 显示全部楼层
现在 都用英语提示了,AI写的就贴出来让人改
发表于 2023-4-10 16:38:15 | 显示全部楼层
liuhe 发表于 2023-4-10 16:17
现在 都用英语提示了,AI写的就贴出来让人改

那就用魔法回复魔法:
根据代码和问题描述,这段代码的作用是在PL线上批量插入长方形块。长方形块的长度分别为2米,1米,0.6米和0.1米,宽度都是0.5米。插入规则是优先使用长度较长的块,并且布置满PL线。插入位置为长方形块的宽边中点都在PL线上。PL线可以是直线,也可以是封闭的折线。
这段代码有一些语法错误,需要进行修正。修正后的代码如下:
需要注意的是,这段代码中存在一个语法错误,即while循环中的第5行和第6行之间缺少了一个左括号。修正后的代码已经在上面给出。

根据代码和问题描述,这段代码的作用是在PL线上批量插入长方形块。长方形块的长度分别为2米,1米,0.6米和0.1米,宽度都是0.5米。插入规则是优先使用长度较长的块,并且布置满PL线。插入位置为长方形块的宽边中点都在PL线上。PL线可以是直线,也可以是封闭的折线。
代码中的注释已经解释了每一行代码的作用。需要注意的是,这段代码中存在一个语法错误,即while循环中的第5行和第6行之间缺少了一个左括号。修正后的代码已经在上面给出。
请添加中文注释
(defun c:tt (/ plen blist i l pt1 pt2 mp blk rot pl)
  (setq plen (getdist "\nEnter the length of the polyline: ")) ; 获取PL线的长度
  (setq blist '((2000 . "2m block") (1000 . "1m block") (600 . "0.6m block") (100 . "0.1m block"))) ; 定义长方形块的长度和名称
  (setq blist (reverse (sort blist (lambda (x y) (< (car x) (car y)))))) ; 按长度从小到大排序
  (setq i 0)
  (while (> plen 0) ; 循环条件是PL线的长度大于0
    (setq l (car (nth i blist))) ; 获取当前需要插入的长方形块的长度
    (setq pl (car (entsel "\nSelect polyline: "))) ; 获取PL线的实体
    (setq pt1 (vlax-curve-getFirstPoint pl)) ; 获取PL线的起点
    (setq pt2 (vlax-curve-getPointAtDist pl (setq plen (- plen l))))) ; 获取插入点的位置
        (setq mp (polar pt1 (angle pt1 pt2) (/ l 2.0))) ; 计算插入点的位置
        (setq blk (cdr (nth i blist))) ; 获取长方形块的名称
        (setq rot (angle pt1 pt2)) ; 计算长方形块需要旋转的角度
        (command "_.insert" blk mp 1.0 1.0 (/ l 2.0) "_.rotate" mp rot) ; 插入长方形块并旋转
        (setq i (mod (1+ i) 4))) ; 更新长方形块的索引
)
 楼主| 发表于 2023-4-10 17:03:05 | 显示全部楼层
xj6019 发表于 2023-4-10 16:38
那就用魔法回复魔法:
根据代码和问题描述,这段代码的作用是在PL线上批量插入长方形块。长方形块的长度 ...

谢谢!
发表于 2023-4-10 23:51:54 来自手机 | 显示全部楼层
xj6019 发表于 2023-4-10 16:38
那就用魔法回复魔法:
根据代码和问题描述,这段代码的作用是在PL线上批量插入长方形块。长方形块的长度 ...

这个改完以后需要循环手动选取曲线么。这个核心算法是,把一个曲线,分成大中小,三种排列组合。这个核心算法正好和我的法兰管道,分成大中小的衬塑管道类似。这个算法AI要是能写出来,我们就不要自己傻傻的写了,直接充钱买会员就行了。
 楼主| 发表于 2023-4-11 10:56:07 | 显示全部楼层
liuhe 发表于 2023-4-10 23:51
这个改完以后需要循环手动选取曲线么。这个核心算法是,把一个曲线,分成大中小,三种排列组合。这个核心 ...

PL线为折线(折角都为90度),主要是转角位置算法不好搞...
发表于 2023-4-11 11:15:42 | 显示全部楼层
本帖最后由 liuhe 于 2023-4-11 11:17 编辑
skorupi 发表于 2023-4-11 10:56
PL线为折线(折角都为90度),主要是转角位置算法不好搞...

你要是想找人搞这个算法,我可以提供定制服务。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2023-11-27 18:33:28 | 显示全部楼层
楼上的让人看著眼馋
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-17 12:53 , Processed in 0.183564 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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