marting 发表于 2018-4-11 19:49:14

幻灯片SLD生成DWG(提取幻灯片数据用LINE画到图中)

本帖最后由 marting 于 2018-4-11 19:56 编辑

读取幻灯数据,充满窗口绘制,有流文件读取的函数,和充满窗口的点的矩阵变换函数,纯LISP实现。



**** Hidden Message *****


(defun xd::slide:->dwg (sld)
(defun _init ()
    (xd::file:seek 18)
    (setq lever (car (xd::file:read 1)))
    (if (= lever 1)
      (progn)
      (progn (setq limit_x(xd::file:bin2int (xd::file:read 2))
                   limit_y(xd::file:bin2int (xd::file:read 2))
                   aspratio (xd::file:bin2int (xd::file:read 4))
             )
      )
    )
    (setq aspratio (/ aspratio 1000000.0))
    (setq box    (XD::Doc:GetView4Pnt)
          origin (car box)
          h      (distance (nth 1 box) (nth 2 box))
          w      (distance (nth 0 box) (nth 1 box))
    )
    (if (< h w)
      (progn (setq sy      (/ limit_x (* aspratio limit_y))
                   sx      1
                   limit_y (/ limit_x aspratio)
                   sx      (/ h limit_y)
                   sy      (* sy sx)
             )
      )
      (progn (setq sy 1
                   sx (* limit_y aspratio)
                   sy (/ w limit_x)
                   sx (* sx sy)
             )
      )
    )
    (xd::file:seek "4")
)
(defun _draw_line ()
    (setq from_x (xd::file:bin2int fcode))
    (setq val (xd::file:read 2))
    (setq from_y (xd::file:bin2int val))
    (setq val (xd::file:read 2))
    (setq to_x (xd::file:bin2int val))
    (setq val (xd::file:read 2))
    (setq to_y (xd::file:bin2int val))
    (setq p1 (list (atof (itoa from_x)) (atof (itoa from_y)) 0.0)
          p2 (list (atof (itoa to_x)) (atof (itoa to_y)) 0.0))
    (setq points (cons (list p1
                           p2
                     )
                     points
               )
    )
    (command "line" (_trans p1) (_trans p2) "")
    (command "chprop" (entlast) "" "color" m_cadcolor "")
    (setq lastx to_x
          lasty to_y
    )
)
(defun _chg_color ()
    (setq m_cadcolor oper)
)
(defun _draw_offset ()
    (setq offx1 oper)
    (setq val (xd::file:read 1))
    (setq offy1 (car val))
    (setq val (xd::file:read 1))
    (setq offx2 (car val))
    (setq val (xd::file:read 1))
    (setq offy2 (car val))
    (setq fromx (+ lastx offx1)
          fromy (+ lasty offy1)
          tox   (+ lastx offx2)
          toy   (+ lasty offy2)
          lastx fromx
          lasty fromy
          y1    fromy
          y2    toy
          p1    (list (atof (itoa fromx)) y1 0.0)
          p2    (list (atof (itoa tox)) y2 0.0)
    )
    (if (not (equal p1 p2 1e-3))
      (progn (command "line" (_trans p1) (_trans p2) "")
             (command "chprop" (entlast) "" "color" m_cadcolor "")
      )
    )
)
(defun _draw_common_pt ()
    (setq fromx lastx
          fromy lasty
          offx2 oper
    )
    (setq val (xd::file:read 1))
    (setq offy2 (car val))
    (setq tox   (+ lastx offx2)
          toy   (+ lasty offy2)
          lastx tox
          lasty toy
          y1    fromy
          y2    toy
          p1    (list fromx y1 0)
          p2    (list tox y2 0)
    )
    (if (not (equal p1 p2 1e-3))
      (progn (command ".line" (_trans p1) (_trans p2) "")
             (command "chprop" (entlast) "" "color" m_cadcolor "")
      )
    )
)
(defun _eof_code () (princ))
(defun _trans (pt)
    (setq ljb pt
          scl (min sx sy)
          pt(mapcar '(lambda (x) (* scl x)) pt)
    )
    (setq m (xd::mat:identity 3))
    (setq m (xd::mat:translation origin))
    (setq pt (xd::point:transform pt m))
    pt
)
(defun _trans1 (pt) pt)
(if (and (setq sld (findfile sld))
         (xd::file:open sld 1)
         (= (xd::file:bin2str (xd::file:read 17))
            "AutoCAD Slide\r\n\032"
         )
      )
    (progn (_init)
         (setq tf t
               points nil
         )
         (while (and tf (setq fcode (xd::file:read 2)))
             (setq oper (car fcode)
                   func (cadr fcode)
             )
             (cond ((and (>= func 128) (<= func 250)) (setq tf nil))
                   ((<= func 127) (_draw_line))
                   ((= func 251) (_draw_offset))
                   ((= func 252) (_eof_code))
                   ((= func 253) (_draw_solid))
                   ((= func 254) (_draw_common_pt))
                   ((= func 255) (_chg_color))
             )
         )
         (xd::file:close)
    )
)
(princ)
)

执行命令TT


(defun c:tt ()
(if (setq sld (getfiled "\n选择生成DWG的SLD文件" "" "sld" 4))
    (progn (xd::slide:->dwg sld))
)
(princ)
)


marting 发表于 2018-4-11 19:55:58

要想按原来大小绘制,把上面代码里面的函数 _trans1 改成_trans 就可以了。

q3_2006 发表于 2018-4-11 19:59:13

大师怎么有这么多时间研究呀..真厉害

20180318 发表于 2018-4-11 20:03:58

這畫面是何意?

newer 发表于 2018-4-11 20:17:32

不仅仅是满足研究幻灯库的格式了,这个要对SLD的格式有很深的理解,才能做到字节级的读取二进制的SLD,并把点连接起来

liuyj 发表于 2018-4-11 20:20:45

圆弧用线段拟合?

newer 发表于 2018-4-11 20:30:52

liuyj 发表于 2018-4-11 20:20
圆弧用线段拟合?

幻灯片数据就是这样,里面只有颜色号、点X,点Y,SOLID,和字体SHX一样,起笔落笔,偏移,再起笔落笔

cable2004 发表于 2018-4-12 08:03:04

本帖最后由 cable2004 于 2018-4-12 08:32 编辑

研究幻灯片数据,厉害呀!

大师提供一下 xd::apply函数

ynhh 发表于 2018-4-12 08:28:13

大师能不能搞一个类似天正建筑中的
幻灯管理的集成应用啊

lrd1861 发表于 2018-4-12 08:46:39

膜拜一下{:1_1:}{:1_1:}{:1_1:}

434939575 发表于 2018-4-12 08:59:11

q3_2006 发表于 2018-4-11 19:59
大师怎么有这么多时间研究呀..真厉害

大师已经走火入魔,停不下来了.......

/db_自贡黄明儒_ 发表于 2018-4-12 11:50:16

厉害了,我的哥{:1_20:}

marting 发表于 2018-4-12 12:21:01

ynhh 发表于 2018-4-12 08:28
大师能不能搞一个类似天正建筑中的
幻灯管理的集成应用啊

天正幻灯管理都有什么功能,请截取几个图片贴上来看看。

819534890 发表于 2018-4-12 12:24:42

回复学习。谢谢

ynhh 发表于 2018-4-12 13:46:34

管理内容包括:增加、删除、拷贝、移动、改名等。

新建】:新建一个用户幻灯库文件,选择文件位置并输入文件名称。

       【打开】:用户选择需要编辑的幻灯库文件。如果该文件不存在,则取消操作。幻灯库文件后缀为SLB。每个幻灯库可包含一个或多个幻灯片SLD文件。本系统支持多库操作,即不关闭当前库的条件下打开目标幻灯片文件,并将此文件设为当前库。

提示:【打开】具有记录历史的功能,可显示最后4次打开的库文件。

【批量入库】:可将所选定的幻灯片SLD文件添加到当前幻灯库中。

【拷贝到】将幻灯库中的幻灯片文件提取出来,另存到指定的目录下中,形成单独的幻灯片文件。

提示:要将幻灯库中的幻灯片文件复制到指定的SLB文件中,可以将目标SLB幻灯库加入管理系统,然后才用鼠标拖拽此幻灯片文件至SLB即可。

(红)【删除】将选中的幻灯库从系统面板中删除。


(黑)【删除】将选中的幻灯片从幻灯库中删除,不可恢复。

其他功能可以参考图库管理界面。
页: [1] 2 3 4 5
查看完整版本: 幻灯片SLD生成DWG(提取幻灯片数据用LINE画到图中)