明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 24929|回复: 63

[讨论] 【e派】自定义填充图案

    [复制链接]
发表于 2014-6-2 18:50:35 | 显示全部楼层 |阅读模式
本帖最后由 xyp1964 于 2014-6-4 07:47 编辑

  自定义填充图案
  一、填充图案的定义格式
  1. 标题行
  由填充图案名称和填充图案描述组成,标题行以“*”为开始标记,填充图案名称和描述由逗号分开,其格式为:
  *pattern-name [, description](“填充图案名称[,填充图案描述])
  星号后面紧跟的是图案名称,执行HATCH命令选择图案时,将显示该名称。方括号内是图案由 HATCH 命令的“?”选项显示时的可选说明。如果省略说明,则图案名称后不能有逗号。

  2. 模式行
  由图案直线定义和填充线的控制信息组成,一个填充图案中可以定义多种类型的图案直线,其格式为:
  angle, x-origin, y-origin, delta-x, delta-y, dash-1, dash-2, ...
  其中各项意义如下:
    angle:填充线图案直线与水平方向的夹角。
    x-origin、y-origin:第一条图案直线经过的起点坐标点
    delta-x:相邻垂直距离最近的两条图案直线沿画线方向上的位移值
    delta-y:相邻垂直距离最近的两条图案直线之间的间距(有方向之分)
    dash-1~n:为一条直线的长度参数,可取正负值或为零,取正值表示该长度段为实线,取负值表示该段为留空,取零则画点。

  二、填充图案定义遵循或应注意的规则:
  ·图案的模式行可以有一行或多行。
  ·图案定义中的每一行最多可以包含 80 个字符。
  ·图案定义必须以字母或数字开头,而不能以特殊字符开头。
  ·AutoCAD 将忽略空行和分号右边的文字。
  ·文件名必须与图案名相同。
  ·曲线需要先转为直线,建议16或24等分。



先讨论,之后公布真相……
初步测试程序在11楼!

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
ucuc2003 + 1

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2014-6-18 20:08:33 | 显示全部楼层
本帖最后由 xyp1964 于 2018-5-17 22:22 编辑

;; 横平竖直及对角线的都简单
  1. ;; xyp-MkPat (xyp-MkPat 基点 起点 终点 单元宽度 单元高度);; delta-x:x轴位移;delta-y:y轴位移;dash-1画线长;dash-2空移长
  2. (defun xyp-MkPat (p0 p1 p2 dx dy / rad ang ang0        ang01 ll dash-1        dash-2 x-origin        y-origin dash-2        delta-x        delta-y delta-y1)
  3.   (setq  rad (angle p1 p2)
  4.         ang (xyp-r2d rad)
  5.         lst (list p1 p2)
  6.   )
  7.   (if (and (>= ang 180) (not (equal ang 360 1e-5)))
  8.     (setq p2 (car lst)
  9.           p1 (cadr lst)
  10.     )
  11.   )
  12.   (setq        p0         (xyp-3d2d p0)
  13.         p1         (xyp-3d2d p1)
  14.         p2         (xyp-3d2d p2)
  15.         p1         (mapcar '- p1 p0)
  16.         p2         (mapcar '- p2 p0)
  17.         rad         (angle p1 p2)
  18.         ang         (xyp-r2d rad)   ; 角度
  19.         dash-1         (distance p1 p2)  ; 线长
  20.         r0         (angle '(0 0) (list dx dy))
  21.         ang0         (xyp-r2d r0)  ; 矩形对角线角度
  22.         ang01         (angle '(0 0) (list (- dx) dy))
  23.         ll         (distance '(0 0) (list dx dy))   ; 矩形对角线长度
  24.         x-origin (car p1)
  25.         y-origin (cadr p1)
  26.         dash-2         (- dash-1 ll)
  27.         delta-x         (* dx (cos r0))
  28.         delta-y         (* dx (sin r0))
  29.         delta-y1 (- delta-y)
  30.   )
  31.   (cond        ((equal y-origin (cadr p2) 1e-5)  ;水平方向
  32.          (list ang x-origin y-origin dx dy dash-1 (- dash-1 dx))
  33.         )
  34.         ((equal x-origin (car p2) 1e-5)  ; 垂直方向
  35.          (list ang x-origin y-origin dy dx dash-1 (- dash-1 dy))
  36.         )
  37.         ((equal ang ang0 1e-5)  ;对角线方向(第1象限)
  38.          (list ang x-origin y-origin delta-x delta-y1 dash-1 dash-2)
  39.         )
  40.         ((equal rad ang01 1e-5)   ; 对角线方向(第2象限)
  41.          (list ang x-origin y-origin delta-x delta-y dash-1 dash-2)
  42.         )
  43.         (t (xyp-PattenCal p1 p2 dx dy))   ;★ 其它方向,这个是难度之处★
  44.   )
  45. )


 楼主| 发表于 2014-6-17 08:38:32 | 显示全部楼层
本帖最后由 xyp1964 于 2018-5-17 22:23 编辑
zhouwanweihf 发表于 2014-6-15 09:42
感谢你的回复,

我需要的是这样的:

  1. (defun c:tt ()
  2.   (xyp-CMDLA0)
  3.   (setq i -1)
  4.   (if (setq ss (ssget '((0 . "CIRCLE"))))
  5.     (while (setq s1 (ssname ss (setq i (1+ i))))
  6.       (setq pt (xyp-DXF 10 s1)
  7.             rr (/ (xyp-DXF 40 s1) 50.)
  8.       )
  9.       (command "ucs" "n" pt)
  10.       (command "hatch" "螺旋纹理" rr (* (xyp-rand)1000) s1 "")
  11.       (command "ucs" "")
  12.     )
  13.   )
  14.   (xyp-CMDLA1)
  15. )

本帖子中包含更多资源

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

x
发表于 2024-6-19 08:54:59 | 显示全部楼层
xyp1964 发表于 2014-6-18 20:08
;; 横平竖直及对角线的都简单

院长大人,求xyp-PattenCal这个函数的算法,对任意角度的线段 dx dy怎么计算啊,一头雾水
 楼主| 发表于 2014-6-2 19:18:09 | 显示全部楼层
上面提到的
angle:填充线图案直线与水平方向的夹角。——这个直接可求 (xyp-r2d(angle p1 p2))
x-origin、y-origin:第一条图案直线经过的起点坐标点——这个也简单(car p1)和(cadr p1)
delta-x:相邻垂直距离最近的两条图案直线沿画线方向上的位移值——复杂且有难度
delta-y:相邻垂直距离最近的两条图案直线之间的间距(有方向之分)——复杂且有难度
dash-1~n:为一条直线的长度参数,可取正负值或为零,取正值表示该长度段为实线,取负值表示该段为留空,取零则画点。 ——线长简单(distance p1 p2),后面的参数复杂且有难度
发表于 2014-6-2 20:24:02 | 显示全部楼层
好复杂啊!!!!!!
发表于 2014-6-2 21:02:27 | 显示全部楼层
  
在AutoCAD中用程序制作岩性填充图案
  
谭光杰 (成都理工大学环境与土木工程学院 成都 610059)
  
在工程制图中经常要使用到各种填充图案,但AutoCAD中所提供的图案是有限的,通常也不能满足作图的要求,因此需要自定义许多填充图案。岩性填充图案通常是很复杂的,用手工进行制作几乎是不可能的。本文提供了程序制作图案的基本算法,并提供了程序的核心部分。
  
关键词岩性填充图案;程序算法;LISP源程序
  

AutoCAD的图案填充方式是偏移线生成方式,在进行图案制作时会有一些基本的限制。地质制图中所用到的岩性填充图案通常较为复杂,按上述方式生成的填充图案基本上不能用手算方式,因此有必要采用程序制作方式来实现。  

  
在AutoCAD的帮助文件中可以找出有关填充图案的具体描述,本文不再重复有关内容,而主要是讨论如何用LISP程序来实现岩性填充图案的制作。
  
1 图案制作的基本限制
  
图1 填充限制示图 图2 单条直线计算图


在AutoCAD中,只有点(point)、直线(line)、多段线(polyline)和轻量多段线(lwpolyline)才能用于制作填充图案,圆和圆弧不能用于制作填充图案,但可以用线性图元进行多段线拟合。
如图1所示,填充图案通常是方形排列的。在一个正方形内的图形要在其它正方形内不会产生变形,必然要求直线的斜率或其倒数为整数。
2 程序制作图案
2.1 直线填充算法
图1所示较为复杂的图形可以由多条直线组成,因此直线是进行图案填充的基本元素。按此思路,可以设定直线是限定在1*1单位的矩形框内。以下就按照此基本假设来得到单条线段的填充算法公式。
我们用图2所示单条直线的计算图予以说明。图2中的每个正方形的边长都是1个单位。直线AC通过偏移算法可以填充到每一个正方形之中,这里假定坐标原点位于O点。以下按照单条直线填充的文本文件描述顺序给出具体的公式。
填充角度:ang=atan(dy/dx)= ∠CAE;
填充线起点坐标:即为A点的坐标。
填充的偏移距离,首先给出斜率大于1时的计算公式。
X方向的偏移距离D1。
D1=|AB|*cos∠BAF=|AB|*sin∠CAE;又因为|AB|=1,所以公式可简化为D1=dy/dist。
Y方向的偏移距离D2。
D2=|AB|*sin∠BAF=|AB|*cos∠CAE;又因为|AB|=1,所以公式可简化为D2=dx/dist。
直线的长度:dist=|AC|。
空格的长度:span=-(|AG|-|AC|)。
对于斜率为其它形式时,可以依照上述方法得出计算公式,参见2.2节的LISP源程序。
2.2 填充图案制作的核心程序
以下程序中所用的变量名与上节含义相同。参数point1和point2是直线的两个端点。Slope为直线的斜率或其倒数。
(defun compute(point1 point2 / ang dist dx dy temp D1D2 slope span)
(setq ang (* 180(/(angle point1 point2)pi))
dist (distance point1 point2)
dx (- (car point2) (car point1))
dy (- (cadr point2) (cadr point1))
)
(cond((and (/= dx 0)(/= dy 0))
(if (> (abs dx)(abs dy))
(setq temp dx dx dy dy (* temp -1.0)))
(setq D1 (/ dy dist)
D2 (/ dx dist)
slope (/ dy dx)
span (- dist (sqrt (+ 1 (* slope slope))))));斜率为整数
((or(= dx 0)(= dy 0));水平线或垂直线
(setq D1 0 D2 1 span (- dist 1)))
)
)
点可以看成是长度为0的水平线或垂直线。
多重描述的填充图案是由多条线段的描述组成的,因此,读者如果要对程序进行扩展,可以按以下顺序编写程序:获取1*1方框内的所有图元名→对每个图元进行检查,看其是否满足图案制作的要求→建立图案填充文件→获取每个图元的坐标→检查斜率是否满足要求→调用上面的程序进行计算→将计算结果输出到图案填充文件。在每一次检查不满足要求时应有相应的错误处理函数。
2.3 圆形填充图案的制作
在AutoCAD中不能用圆形图元进行图案制作,在不改变AutoCAD的算法的情况下可以用直线段来进行拟合。对于方形排列的圆形图案可以用16边外接多边形进行拟合,如图3。
从图3可知道,第一相和第二相可以分别用4条边拟合,第三相可以用8条边进行拟合,因此圆形图案可以用16边外接多边形进行拟合。
对于圆弧图案可以将圆形图案中的某些边去掉后进行拟合。用直线、点、圆弧和圆可以组成任何复杂的图案。这样,可以满足工程作图中岩性填充图案的需要。


笔者使用上述的方法作出如图4所示的复杂填图案。
如果对曲线拟合的要求很高,可以使用下面的外部参照的方法以满足作图的要求。
3 外部参照的制作方法
以下的方法转引自《VISUAL LISP程序设计—技巧与范例》(陈伯雄,冯伟 北京:人民邮电出版社 2002.8)。当上述方法达不到理想的方法可以考虑以下的方法。
许多特殊的剖面图案是AutoCAD所提供的功能无法制作的。例如,如图5所示的木纹图案,是由同心的曲线组合而成的。将木纹图填充于其它的图形之中,交互操作的解决方案如下。
建立木纹图案,在图形文档中生成,以mm为单位应当足够小,基点放在年轮的中心附近。
用xref命令将图案填充至目标图案之中。
用xclip命令对外部参照进行修剪,如图5所示。
当然,也可以将木纹做成内部、外部块(block),也能达到同样的效果。
外部参照剪裁边界不支持弧线段,解决的方法是用直线段对弧线段进行拟合。在《VISUAL LISP程序设计—技巧与范例》一书中给出了具体解决方案的程序。
图5:木纹图
4 结语
用程序绘制填充图案的思路是用直线代替弧线并且不改变AutoCAD的基本算法。以上方法可以方便地制作出任何满足地质要求的岩性填充图案。对岩性填充图案来说,使用外部参照有一定的局限性,不能任意地改变填充比例,只能生成相似的图案以满足作图要求。




本帖子中包含更多资源

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

x
 楼主| 发表于 2014-6-2 21:31:37 | 显示全部楼层
本帖最后由 xyp1964 于 2014-6-2 21:55 编辑
Gu_xl 发表于 2014-6-2 21:02

这个属于正方形的特例,不具有通用性。
 楼主| 发表于 2014-6-2 21:32:28 | 显示全部楼层
自定义填充参数示意图

本帖子中包含更多资源

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

x
 楼主| 发表于 2014-6-3 10:01:22 | 显示全部楼层
本帖最后由 xyp1964 于 2014-6-3 10:07 编辑

据说“ET中有个SuperHatch”没用过
错缝功能也是个难题

本帖子中包含更多资源

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

x

点评

请问下,这个图生成的pat文件有多大? 文件行数是否大致等于图元数*24*?  发表于 2014-7-11 12:48
发表于 2014-6-3 11:57:48 | 显示全部楼层
本帖最后由 434939575 于 2014-6-3 11:59 编辑

确实很强大。开眼了。
 楼主| 发表于 2014-6-3 13:36:07 | 显示全部楼层
错缝问题

本帖子中包含更多资源

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

x
发表于 2014-6-3 17:21:01 | 显示全部楼层
厉害……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 03:56 , Processed in 0.221291 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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