xyp1964 发表于 2014-6-2 18:50:35

【e派】自定义填充图案

本帖最后由 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楼!

xyp1964 发表于 2014-6-18 20:08:33

本帖最后由 xyp1964 于 2018-5-17 22:22 编辑

;; 横平竖直及对角线的都简单;; xyp-MkPat (xyp-MkPat 基点 起点 终点 单元宽度 单元高度);; delta-x:x轴位移;delta-y:y轴位移;dash-1画线长;dash-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)
(setqrad (angle p1 p2)
      ang (xyp-r2d rad)
      lst (list p1 p2)
)
(if (and (>= ang 180) (not (equal ang 360 1e-5)))
    (setq p2 (car lst)
          p1 (cadr lst)
    )
)
(setq      p0         (xyp-3d2d p0)
      p1         (xyp-3d2d p1)
      p2         (xyp-3d2d p2)
      p1         (mapcar '- p1 p0)
      p2         (mapcar '- p2 p0)
      rad         (angle p1 p2)
      ang         (xyp-r2d rad)   ; 角度
      dash-1         (distance p1 p2); 线长
      r0         (angle '(0 0) (list dx dy))
      ang0         (xyp-r2d r0); 矩形对角线角度
      ang01         (angle '(0 0) (list (- dx) dy))
      ll         (distance '(0 0) (list dx dy))   ; 矩形对角线长度
      x-origin (car p1)
      y-origin (cadr p1)
      dash-2         (- dash-1 ll)
      delta-x         (* dx (cos r0))
      delta-y         (* dx (sin r0))
      delta-y1 (- delta-y)
)
(cond      ((equal y-origin (cadr p2) 1e-5);水平方向
         (list ang x-origin y-origin dx dy dash-1 (- dash-1 dx))
      )
      ((equal x-origin (car p2) 1e-5); 垂直方向
         (list ang x-origin y-origin dy dx dash-1 (- dash-1 dy))
      )
      ((equal ang ang0 1e-5);对角线方向(第1象限)
         (list ang x-origin y-origin delta-x delta-y1 dash-1 dash-2)
      )
      ((equal rad ang01 1e-5)   ; 对角线方向(第2象限)
         (list ang x-origin y-origin delta-x delta-y dash-1 dash-2)
      )
      (t (xyp-PattenCal p1 p2 dx dy))   ;★ 其它方向,这个是难度之处★
)
)

xyp1964 发表于 2014-6-17 08:38:32

本帖最后由 xyp1964 于 2018-5-17 22:23 编辑

zhouwanweihf 发表于 2014-6-15 09:42 static/image/common/back.gif
感谢你的回复,

我需要的是这样的:

(defun c:tt ()
(xyp-CMDLA0)
(setq i -1)
(if (setq ss (ssget '((0 . "CIRCLE"))))
    (while (setq s1 (ssname ss (setq i (1+ i))))
      (setq pt (xyp-DXF 10 s1)
            rr (/ (xyp-DXF 40 s1) 50.)
      )
      (command "ucs" "n" pt)
      (command "hatch" "螺旋纹理" rr (* (xyp-rand)1000) s1 "")
      (command "ucs" "")
    )
)
(xyp-CMDLA1)
)

狂奔的大猫 发表于 2024-6-19 08:54:59

xyp1964 发表于 2014-6-18 20:08
;; 横平竖直及对角线的都简单

院长大人,求xyp-PattenCal这个函数的算法,对任意角度的线段 dx dy怎么计算啊,一头雾水

xyp1964 发表于 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),后面的参数复杂且有难度

spp_wall 发表于 2014-6-2 20:24:02

好复杂啊!!!!!!

Gu_xl 发表于 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的基本算法。以上方法可以方便地制作出任何满足地质要求的岩性填充图案。对岩性填充图案来说,使用外部参照有一定的局限性,不能任意地改变填充比例,只能生成相似的图案以满足作图要求。





xyp1964 发表于 2014-6-2 21:31:37

本帖最后由 xyp1964 于 2014-6-2 21:55 编辑

Gu_xl 发表于 2014-6-2 21:02 static/image/common/back.gif

这个属于正方形的特例,不具有通用性。

xyp1964 发表于 2014-6-2 21:32:28

自定义填充参数示意图

xyp1964 发表于 2014-6-3 10:01:22

本帖最后由 xyp1964 于 2014-6-3 10:07 编辑

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

434939575 发表于 2014-6-3 11:57:48

本帖最后由 434939575 于 2014-6-3 11:59 编辑

确实很强大。开眼了。

xyp1964 发表于 2014-6-3 13:36:07

错缝问题

xhq1954425 发表于 2014-6-3 17:21:01

厉害……
页: [1] 2 3 4 5 6 7
查看完整版本: 【e派】自定义填充图案