明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 飞诗(fsxm)

[讨论] 大家都来玩玩:选图形生成pat填充文件

[复制链接]
发表于 2013-12-6 00:42:46 | 显示全部楼层




信·CAD工具箱 用户使用 7I 命令 导入 7xz文件
没装工具箱的 加载EF_Lib 和EF_Pat   

创建填充图样命令 EF_PatMake    文本查看 EF_PatEdit

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +3 收起 理由
飞诗(fsxm) + 3 赞一个!

查看全部评分

发表于 2013-12-6 00:47:40 | 显示全部楼层
本帖最后由 elitefish 于 2013-12-6 01:04 编辑

伪源程序
思路
1.将外框分割为 nxn 行列网格
2.将所有框内直线 点 坐标对齐到 网格中
3.根据PAT规则 逐条写入各元素
难点:
1.分割网格要保证精度的同时不至于过多分割
2.直线的空白长度 不是 外框对角线长度-直线长度
  而是看直线占据了多少格 比如 i * k格,那空白长度为 i * k外框的对角线长度 L-直线长度
3.相邻直线的位置 不是左边一个外框
   这里用了穷举法 找出 i*k个外框内离直线平行距离最近的一个外框
   以该外框内直线 作为第二线段 起始位置
  希望高手用数学的方法解决最近平行直线定位

注意:由于图案线段角度精度的问题,故填充时请选择将原点设置在填充框内,
          否则距离世界坐标原点很远的地方填充变形,差之毫厘谬以千里啊。
  1. ;填充子样块 按 X Y 边分割为 n m 份〕
  2. ;n 为整数 分格数
  3. ;保证 n/m ≈ x/Y 且 lstX lstY坐标对齐到分割网格后误差小于(* fuzz (min a b))   (a b)为子样块边长
  4. ;lstX lstY 子样图形 X Y坐标集合
  5. ;Box 子样块范围盒坐标
  6. ;fuzz 容差比例 (按最小
  7. (defun EF_Pat:FenGeShu (ptList Box fuzz
  8.       /
  9.       lstX lstY
  10.       X Y x0 y0
  11.       n
  12.       rtn
  13.       dx dy d
  14.       )
  15.   (setq X (- (caadr Box) (caar Box))
  16.   Y (- (cadadr Box) (cadar Box))
  17.   x0 (caar Box)
  18.   y0 (cadar Box)
  19.   lstX (mapcar 'car ptList)
  20.   lstY (mapcar 'cadr ptList)
  21.   lstX (mapcar '(lambda (e) (- e x0)) lstX)
  22.   lstY (mapcar '(lambda (e) (- e y0)) lstY)
  23.   n 1
  24.   dx (/ X n)
  25.   dy (/ Y n)
  26.   d (* fuzz (min X Y))
  27.   )
  28.   
  29.   (while (or (apply 'or (mapcar '(lambda (e)
  30.            (> (abs (- (* dx (EF_Math:FixEx (/ e dx) 0)) e)) d)  ;对齐网格后的存在某个X坐标误差超出范围
  31.            )
  32.         lstX
  33.         ))
  34.        (apply 'or (mapcar '(lambda (e)
  35.            (> (abs (- (* dy (EF_Math:FixEx (/ e dy) 0)) e)) d)  ;对齐网格后的存在某个X坐标误差超出范围
  36.            )
  37.         lstY
  38.         ))
  39.          )
  40.     ;进一步细分网格
  41.     (setq n (1+ n)
  42.     dx (/ X n)
  43.     dy (/ Y n)
  44.     )
  45.     )
  46.   
  47.   (list (mapcar '(lambda (pt / x1 y1)
  48.        (setq x1 (- (car pt) x0)
  49.        y1 (- (cadr pt) y0)
  50.        )
  51.        (list (* dx (EF_Math:FixEx (/ x1 dx) 0))
  52.        (* dy (EF_Math:FixEx (/ y1 dy) 0))
  53.        )
  54.        )
  55.     ptList
  56.     );网格对齐后,相对Box左下角坐标
  57.   (list dx dy)  ;网格尺寸
  58.   n    ;网格行列数
  59.   (mapcar '(lambda (pt / x1 y1)
  60.        (setq x1 (- (car pt) x0)
  61.        y1 (- (cadr pt) y0)
  62.        )
  63.        (list (EF_Math:FixEx (/ x1 dx) 0)
  64.        (EF_Math:FixEx (/ y1 dy) 0)
  65.        )
  66.        )
  67.     ptList
  68.     );网格对齐后,坐标对应网格位置
  69.   )
  70.   )


  71. ;pt 点坐标(相对)
  72. ;X Y     子样块x,y向总长
  73. (defun EF_Pat:PointPat (pt X Y
  74.       /
  75.       Ox Oy
  76.       )
  77.   (list 0.0 (car pt) (cadr pt) 0 Y 0.0 (- 0 X))
  78.   )


  79. ;pt1 pt2 直线坐标(相对)
  80. ;X Y     子样块x,y向总长
  81. ;dx dy   网格距离
  82. (defun EF_Pat:LinePat (pt1 pt2 X Y dx dy
  83.            /
  84.            m n |m| |n|
  85.            ox oy
  86.            len dLen
  87.            ang a
  88.            divY
  89.            i k
  90.            lstDiv div
  91.            )
  92.   (setq m (EF_Math:FixEx (/ (- (car pt2) (car pt1)) dx) 0)    ;直线X向占格数
  93.   n (EF_Math:FixEx (/ (- (cadr pt2) (cadr pt1)) dy) 0)  ;直线Y向占格数
  94.   )
  95.   
  96.   ;以下保证 m n 互质
  97.   (setq i (min (abs n) (abs m)))
  98.   (while (> i 1)
  99.     (if (and (= (rem m i) 0) (= (rem n i) 0))
  100.       (progn
  101.   (setq m (/ m i)
  102.         n (/ n i)
  103.         )
  104.   (setq i (min (abs n) (abs m)))
  105.   )
  106.       (setq i (1- i))
  107.       )
  108.     )
  109.   ;以上保证 m n 互质
  110.   
  111.   (if (= m 0) (setq n 1))
  112.   (if (= n 0) (setq m 1))
  113.   
  114.   (setq ox (car pt1)  ;起点坐标x
  115.   oy (cadr pt1)  ;起点坐标y
  116.   len (distance pt1 pt2)  ;直线长度
  117.   dLen (- (distance '(0 0) (list (* m X) (* n Y))) len)  ;直线空白间隔
  118.   )
  119.   
  120.   (if (and (= m 0) (= n 0))
  121.     (setq ang 0)
  122.     (setq ang (angle pt1 pt2))  ;直线角度
  123.     )
  124.   
  125.   ;第m n个子样块直线到本子样块直线的平行间距
  126.   (defun divY (m n / l a)
  127.     (setq a (angle '(0 0) (list (* m X) (* n Y)))
  128.     l (distance '(0 0) (list (* m X) (* n Y)))
  129.     a (- a ang)
  130.     )
  131.     (* l (sin a))
  132.     );end divY

  133.   (cond ((= m 0) (setq i 1 k 0))
  134.   ((= n 0) (setq i 0 k 1))
  135.   (T
  136.    (if (> m 0) (setq i -1) (setq i 1))
  137.    (repeat (1+ (fix (abs m)))
  138.      (if (> n 0) (setq k -1) (setq k 1))
  139.      ;(setq k -1)
  140.      (if (> m 0) (setq i (1+ i))  (setq i (1- i)))
  141.      (repeat (1+ (fix (abs n)))
  142.        (if (> n 0) (setq k (1+ k)) (setq k (1- k)))
  143.        (if (or (/= i 0) (/= k 0))
  144.          (setq lstDiv (cons (list (divY i k) i k) lstDiv))
  145.          )
  146.        )
  147.      )
  148.    (setq lstDiv (vl-sort lstDiv '(lambda (e1 e2) (< (abs (car e1)) (abs (car e2))))))
  149.    (setq lstDiv (vl-remove-if '(lambda (e) (equal (car e) 0 1e-6)) lstDiv))
  150.    (setq i (cadar lstDiv) k (caddar lstDiv))
  151.    )
  152.   )

  153.   ;最近的平线直线在 i k 块
  154.   (setq a (angle '(0 0) (list (* i X) (* k Y)))
  155.   l (distance '(0 0) (list (* i X) (* k Y)))
  156.   a (- a ang)
  157.   )
  158.   
  159.   (setq delta-x (* l (cos a))
  160.   delta-y (* l (sin a))
  161.   )
  162.   
  163.   (list ang ox oy delta-x delta-y len (- 0 dLen))
  164.   )


  165. ;========================================================================
  166. ;==========================      主函数       ===========================
  167. ;========================================================================
  168. (defun C:EF_PatMake ( /
  169.          ss pt b s
  170.          name desc
  171.          i n ename edata
  172.          pat pats
  173.          FenGe
  174.          dx dy ptList X Y
  175.          pt10 pt11
  176.          fuzz
  177.          )
  178.   (prompt "\n[创建填充图样] 选择图样外框(矩形)")
  179.   
  180.   ;设置精度比例
  181.   (if (EF:Config-getDwgKey "填充图样" "精度")
  182.     (setq fuzz (atof (EF:Config-getDwgKey "填充图样" "精度")))
  183.     (setq fuzz 0.01)
  184.     )
  185.   
  186.   (if (and (setq e (car (entsel)))
  187.      (setq box (EF:PickSet-getBox e))
  188.      (setq ss (ssget "C"
  189.          (car box)
  190.          (cadr box)
  191.          '((0 . "POINT,LINE"))
  192.          ))
  193.      (setq name (getstring "\n图样命名:"))
  194.      (setq desc (getstring "\n图样说明:"))
  195.      (setq s (getreal "\n图样比例:"))
  196.      )
  197.     (progn
  198.       (setq X (- (caadr box) (caar box))
  199.       Y (- (cadadr box) (cadar box))
  200.       )
  201.       (setq i -1 n (sslength ss))
  202.       (while (< (setq i (1+ i)) n)
  203.   (setq ename (ssname ss i)
  204.         edata (entget ename)
  205.         )
  206.   (if (assoc 10 edata) (setq ptList (cons (cdr (assoc 10 edata)) ptList)))
  207.   (if (assoc 11 edata) (setq ptList (cons (cdr (assoc 11 edata)) ptList)))
  208.   )

  209.       (setq FenGe (EF_Pat:FenGeShu ptList box fuzz))
  210.       (setq dx (caadr FenGe)
  211.       dy (cadadr FenGe)
  212.       ptList (mapcar '(lambda (e1 e2) (list e1 e2)) ptList (car FenGe))  ;实际坐标对应相对坐标
  213.       )
  214.       
  215.       (setq i -1
  216.       n (sslength ss)
  217.       pats (list (strcat "*" name ", " desc))
  218.       )
  219.       
  220.       (while (< (setq i (1+ i)) n)
  221.   (setq ename (ssname ss i))
  222.   (setq edata (entget ename))
  223.   (cond ((= (cdr (assoc 0 edata)) "POINT")
  224.          (setq pt10 (cdr (assoc 10 edata))
  225.          pt10 (cadr (assoc pt10 ptList))
  226.          )
  227.          (setq pat (EF_Pat:PointPat
  228.          (mapcar '(lambda (e) (/ e s)) pt10)
  229.          (/ X s)
  230.          (/ Y s)
  231.          )
  232.          )
  233.          )
  234.         ((= (cdr (assoc 0 edata)) "LINE")
  235.          (setq pt10 (cdr (assoc 10 edata))
  236.          pt10 (cadr (assoc pt10 ptList))
  237.          pt11 (cdr (assoc 11 edata))
  238.          pt11 (cadr (assoc pt11 ptList))
  239.          )
  240.          (setq pat (EF_Pat:LinePat
  241.          (mapcar '(lambda (e) (/ e s)) pt10)
  242.          (mapcar '(lambda (e) (/ e s)) pt11)
  243.          (/ X s)
  244.          (/ Y s)
  245.          (/ dx s)
  246.          (/ dy s)
  247.          )
  248.          )
  249.          )
  250.         )
  251.   
  252.   (setq pat (strcat (EF:String-SimpleNum (angtos (car pat) 0 6))
  253.         ","
  254.         (EF:List->String (mapcar '(lambda (e)
  255.                   (EF:String-SimpleNum (rtos e 2 6))
  256.                   )
  257.                (cdr pat)) ",")
  258.         )
  259.         )
  260.   (setq pats (append pats (list pat)))
  261.   )
  262.       (setq file (open (if (= (getvar 'measurement) 1)
  263.        (findfile "acadiso.Pat")
  264.        (findfile "acad.Pat")
  265.        )
  266.            "a"
  267.            )
  268.       )
  269.       (write-line "" file)
  270.       (mapcar '(lambda (e) (write-line e file)) pats)
  271.       (close file)
  272.       (princ "\n成功添加填充图样")
  273.       (princ)
  274.       )
  275.     )
  276.   )

  277. ;打开Pat文件
  278. (defun C:EF_PatEdit ()
  279.   (if (= (getvar 'measurement) 1)
  280.     (startapp "explorer" (findfile "acadiso.Pat"))
  281.     (startapp "explorer" (findfile "acad.Pat"))
  282.     )
  283.   )

评分

参与人数 1明经币 +1 收起 理由
风树 + 1 神马都是浮云

查看全部评分

发表于 2014-10-21 12:05:22 | 显示全部楼层
成果呢? 飞诗大师打完酱油就消失了?
发表于 2015-2-2 23:10:49 | 显示全部楼层
好,高手顶一下
发表于 2015-7-19 14:18:09 | 显示全部楼层
想不出通用的原理
发表于 2015-7-19 14:31:14 | 显示全部楼层

本帖子中包含更多资源

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

x
发表于 2016-2-15 16:44:47 | 显示全部楼层
http://bbs.mjtd.com/thread-171504-1-1.html           相关源码,能用但不是很优秀
发表于 2016-5-26 17:58:59 | 显示全部楼层
发表于 2016-7-22 10:59:29 | 显示全部楼层
hao3ren 发表于 2013-11-28 10:28
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=91425&extra=page%3D1%26filter%3Dtypeid%26typeid%3D1 ...

非常感谢!!
发表于 2016-7-22 11:05:27 | 显示全部楼层
hao3ren 发表于 2013-11-28 10:28
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=91425&extra=page%3D1%26filter%3Dtypeid%26typeid%3D1 ...

非常感谢!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-23 04:32 , Processed in 0.169696 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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