明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 481|回复: 3

[源码] 请高手帮忙修改下源码,素土夯实!

[复制链接]
发表于 2024-5-9 17:33 | 显示全部楼层 |阅读模式

修改要求如下:
1、不管当前图层是什么,始终使用0图层,颜色线型线宽全部随层、线型比例为1,且不改变当前图层,避免需要重复切换图层。
2、画完以后整个图形成一个图块,图块置于0图层,块名设置为“素土夯实”。
  1. (if (null vlax-dump-object) (vl-load-com));;将 Visual LISP 扩展功能加载到 AutoLISP----0000级加载
  2. ;;常量定义
  3. (setq *Acad* (vlax-get-acad-object)
  4.   *AcDocument* (vla-get-activedocument *Acad*)  ; 获取当前图档指针
  5.   *Model-Space* (vla-get-modelspace *AcDocument*)
  6.   *Paper-Space* (vla-get-PaperSpace *AcDocument*)
  7.   *BLKS* (vla-get-Blocks *AcDocument*)
  8.   *LAYS* (vla-get-Layers *AcDocument*)
  9.   *ACLYS* (vla-get-activeLayer *AcDocument*)
  10.   *LTS* (vla-get-Linetypes *AcDocument*)
  11.   pi2     (* pi 0.5)
  12.   pi4     (* pi 0.25)
  13.   3pi4   (* 0.75 pi)
  14.   2pi     (+ pi pi)
  15.   3pi2   (+ 3pi4 3pi4)  ;; (* 1.5 pi)
  16.   5pi4   (+ pi pi4)  ;;(* 1.25 pi)
  17.   7pi4   (+ 3pi2 pi4) ;;(* 1.75 pi)
  18. )


  19. ;;素土夯实 rammed-earth-------------c:ram-soil
  20. (defun c:ST (/ cmde plis len ang hi num p1 p2 p3 p4 e0 pt1 pt2 pt22 pt3 pt33 pt4 pt44 pk11 pk2 pk22 pk3 pk33 n)
  21.   (setq cmde (getvar "CMDECHO"))
  22.   (setvar "CMDECHO" 0)
  23.   (setq p1 (getpoint "\n 第一角点: ") p2 (getcorner p1 "\n 第二角点: "))
  24.   (setq
  25.     plis (format2pt p1 p2)
  26.     p1 (car plis)
  27.     p2 (cadr plis)
  28.     p3 (caddr plis)
  29.     p4 (cadddr plis)
  30.     len (distance p1 p2)
  31.     ang (angle p1 p2)
  32.     hi (distance p1 p4)
  33.     num (fix (/ len (* 2.0 hi)))  ;;填充单元数
  34.     e0 (entlast)
  35.   )
  36.   (setq pt1 (polar p4 ang hi))
  37.   (command ".UNDO" "BE")
  38.   (makeline pt1 p1)
  39.   (setq pt2 (polar pt1 ang (* 0.5 hi)))
  40.   (setq pt22 (polar p1 ang (* 0.5 hi)))
  41.   (makeline pt2 pt22)
  42.   (setq pt3 (polar pt2 ang (* 0.5 hi)))
  43.   (setq pt33 (polar pt22 ang (* 0.5 hi)))
  44.   (makeline pt3 pt33)
  45.   (setq pt4 (polar pt3 ang hi))
  46.   (setq pt44 (polar pt33 ang hi))
  47.   (setq pk11 (pertolinecz pt3 pt4 pt44))
  48.   (makeline pt3 pk11)
  49.   (setq pk2 (polar pt3 (- ang 3pi4) (* 0.47 hi)))
  50.   (setq pk22 (pertolinecz pk2 pt4 pt44))
  51.   (makeline pk2 pk22)
  52.   (setq pk3 (polar pt33 (+ ang pi4) (* 0.47 hi)))
  53.   (setq pk33 (polar pt33 ang (* 0.665 hi)))
  54.   (makeline pk3 pk33)
  55.   (setq ss (last_ent e0))
  56.   (slch:lwpolyline (list p4 (polar p4 ang (+ (* num 2.0 hi) hi))) nil ByLayer "0" ByLayer nil)
  57.   (setq n 0)
  58.   (while (> num 1)
  59.     (setq p2 (polar p4 ang (* 2.0 hi (setq n (1+ n)))))
  60.     (command "_copy" ss "" p4 p2)
  61.     (setq num (1- num))
  62.   )
  63.   (command "_.undo" "_end")
  64.   (setq ss (last_ent e0))
  65.   (command "_move" ss "" (cadr (grread 5)) pause)
  66.   (setvar "CMDECHO" cmde)
  67.   (princ)
  68. )

  69. ;;--------函数部分-------

  70. ;取得图元参数值内容----------(一级)-------
  71. ;;(setq h (dxf1 ent 40))
  72. ; ent 为实体名或实体entget,
  73. (defun dxf1 (ent i / tmp)
  74.   (if (= (type ent) 'ENAME)
  75.     (setq ent (entget ent '("*")))
  76.   )
  77.   (setq tmp (cdr (assoc i ent)))
  78.   (if (null tmp)
  79.     (cond
  80.     ((= i 66) 0)
  81.       ((= i 62) 256)
  82.       ((= i 370) (setq tmp -1))
  83.       ((= i 6) "ByLayer")
  84.     )
  85.     tmp  
  86.   )
  87. )
  88. ;; 函数取得en之后生成的所有图元的选择集-----------(一级)-----------
  89. (defun last_ent (en / ss)
  90.   (if en
  91.     (progn
  92.       (setq ss (ssadd))
  93.       (while (setq en (entnext en))
  94.         (if (not (member (dxf1 en 0) '("ATTRIB" "VERTEX" "SEQEND")))
  95.           (ssadd en ss)
  96.         )                             
  97.       )                              
  98.       (if (zerop (sslength ss))(setq ss nil))
  99.       ss
  100.     )                                
  101.     (ssget "_x")
  102.   )                                   
  103. )
  104. ;计算cp到p1 p2的垂足点-----------(一级)---------
  105. (defun pertolinecz (cp p1 p2 / norm)
  106.   (setq norm (mapcar '- p2 p1)
  107.     p1 (trans p1 0 norm)
  108.     cp (trans cp 0 norm)
  109.   )
  110.   (trans (list (car p1) (cadr p1) (caddr cp)) norm 0)
  111. )
  112. ;-------生成一条line  ----(一级)------------------------
  113. ;;参数:pt1:起点,pt2:终点,均为三维点,即(x y z)
  114. (defun makeline (pt1 pt2)
  115.   (entmakex (list
  116.     '(0 . "line")
  117.     (cons 10 pt1)
  118.     (cons 11 pt2))
  119.   )
  120. )
  121. ;;两点求四点矩形表:(左下 右下 右上 左上)------(一级)-----------
  122. (defun format2pt (pt1 pt2 / x1 x2 xx y1 y2 yy)
  123.   (setq x1 (car pt1))
  124.   (setq x2 (car pt2))
  125.   (setq y1 (cadr pt1))
  126.   (setq y2 (cadr pt2))
  127.   (if (< x2 x1)
  128.     (progn
  129.       (setq xx x1)
  130.       (setq x1 x2)
  131.       (setq x2 xx)
  132.     )
  133.   )
  134.   (if (< y2 y1)
  135.     (progn
  136.       (setq yy y1)
  137.       (setq y1 y2)
  138.       (setq y2 yy)
  139.     )
  140.   )
  141.   (list (list x1 y1) (list x2 y1) (list x2 y2) (list x1 y2))
  142. )

  143. ;点表生成多段线--------(一级)----------------
  144. ;线宽=nil,线宽为0  ;是否闭合=nil,不闭合 ;图层=nil,为当前图层 ;颜色=nil,为当前图层颜色  ;线型比例=nil,为1
  145. ;(slch:lwpolyline 点表 是否闭合 线宽 图层 颜色 线型比例)
  146. ;(slch:lwpolyline (list (1 2) (2 3)) T 2 "中心线" 6 5)
  147. (defun slch:lwpolyline (lst dxf70 plwid lay lwplcol lwplbili)
  148.   (entmake
  149.     (append
  150.       (list
  151.         '(0 . "LWPOLYLINE")    ;多段线
  152.         '(100 . "AcDbEntity")
  153.         '(100 . "AcDbPolyline")
  154.         (cons 90 (length lst)) ;点表
  155.         (if (= dxf70 T)
  156.           (cons 70 1)          ;是否闭合
  157.           (cons 70 0)
  158.         )
  159.         (if plwid
  160.           (cons 43 plwid)      ;线宽
  161.           (cons 43 0)
  162.         )
  163.         (if lay
  164.           (cons 8 lay)         ;图层
  165.           (cons 8 (getvar "clayer"))
  166.         )
  167.         (if lwplcol
  168.           (cons 62 lwplcol)    ;颜色
  169.           (cons 62 256)
  170.         )
  171.         (if lwplbili
  172.           (cons 48 lwplbili)   ;线型比例
  173.           (cons 48 (* 0.01 (getvar "DIMLFAC")))
  174.         )
  175.       )
  176.       (mapcar '(lambda (pt) (cons 10 pt)) lst)
  177.     )
  178.   )
  179. )





本帖子中包含更多资源

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

x

点评

用填充多简单  发表于 2024-5-9 21:53
发表于 2024-5-9 18:26 | 显示全部楼层
本帖最后由 飞雪神光 于 2024-5-9 18:27 编辑


不要把函数和变量放在外面

本帖子中包含更多资源

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

x
 楼主| 发表于 2024-5-9 20:40 | 显示全部楼层
飞雪神光 发表于 2024-5-9 18:26
不要把函数和变量放在外面

感谢大神出手帮忙,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-26 12:04 , Processed in 0.174871 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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