明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1638|回复: 12

[求助]版主帮帮忙啊----数据以规定形式输出

  [复制链接]
发表于 2008-4-6 11:33 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2008-4-6 11:43:48 编辑

附件是一个可读取任意线的顶点坐标,并已文本输出的程序,希望大家帮忙改改,让它一行一根线数据而不是一行一个点的数据,我所提取的多义线只有2~4点.写出数据要保证4个点.数据形式如下:
(线)1,x1,y1z1,x2,y2,z2,x3,y3,z3,x4,y4,z4----(点与点间以逗号隔开)
(线)2,x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4
(线)3,x1,y1,z1,x2,y2,z2,x3,y3,z3,9999,9999,9999--(点数不够以9999补满)

;;;;;;;;;;;;;;根据等高线标高取出数据
(DEFUN C:outh
       (/ SST H fi N I J K p NAME DXF TYPE_LINE XY_COUNT F x y PT1 D N1)
  (setq fi '((-4 . "<OR")  ; Filter for ssget.
      (0 . "POLYLINE")
      (0 . "LWPOLYLINE")
      (0 . "SHAPE")
      (0 . "INSERT")
      (-4 . "OR>")
     )
  )
 (setq F (getfiled "写出文件"   "" "txt" 1))
 (SETQ F (OPEN F "w"))
  (PROMPT " \n选取等高线:")
  (SETQ SST (SSGET fi))
  (SETQ N (SSLENGTH SST))
  (SETQ J 0)
  (setq k 0)
  (setq p (getint " \n指定起始点号<1>:"))
  (IF (= NIL P)
    (setq p 1)
  )
  (REPEAT N
    (SETQ NAME (SSNAME SST J))
    (SETQ J (1+ J))
    (SETQ DXF (ENTGET NAME))
    (SETQ TYPE_LINE (CDR (ASSOC 0 DXF)))
    (COND (
    (= TYPE_LINE "POLYLINE")
    (SETQ XY_COUNT (POLYLINE DXF NAME))
    (setq i (length xy_count))
    (setq k 0)
    (repeat i
      (setq y (nth k xy_count))
      (setq h (nth 2 y))
      (setq x (nth 1 y))
      (setq y (nth 0 y))
      (setq y (strcat (itoa P)
        ","
        (rtos Y 2 3)
        ","
        (rtos X 2 3)
        ","
        (rtos h 2 3)
       )
      )
      (write-line y f)
      (setq p (1+ p))
      (setq k (1+ k))
      (setq D D)
      (setq N1 N1)
    )
   )
   ((= TYPE_LINE "LWPOLYLINE")
    (SETQ H (CDR (ASSOC 38 DXF)))
    (SETQ XY_COUNT (LWPOLYLINE DXF))
    (setq i (length xy_count))
    (setq k 0)
    (repeat i
      (setq y (nth k xy_count))
      (setq x (nth 1 y))
      (setq y (nth 0 y))
      (setq y (strcat (itoa P)
        ","
        (rtos X 2 3)
        ","
        (rtos Y 2 3)
        ","
        (rtos h 2 3)
       )
      )
      (write-line y f)
      (setq p (1+ p))
      (setq k (1+ k))
      (setq D D)
      (setq N1 N1)
    )
   )
   ((OR (= TYPE_LINE "SHAPE") (= TYPE_LINE "INSERT"))
    (SETQ PT1 (CDR (ASSOC 10 DXF)))
    (SETQ X (NTH 1 PT1))
    (SETQ Y (NTH 0 PT1))
    (SETQ H (NTH 2 PT1))
    (setq y (strcat (itoa P)
      ","
      (rtos Y 2 3)
      ","
      (rtos X 2 3)
      ","
      (rtos h 2 3)
     )
    )
    (write-line y f)
    (setq p (1+ p))
    (setq D D)
    (setq N1 N1)
   )
    )
  )
  (close f)
)
;;;;;;;;;;;;;;;;;;;
(defun POLYLINE (DXF E1 / XY E2 count_xy pd)
  (setq count_xy nil)
  (SETQ DXF (MEMBER (ASSOC 330 DXF) DXF))
  (SETQ E2 (ENTNEXT E1))
  (SETQ DXF (ENTGET E2))

  (setq e1 (cdr (assoc 0 dxf)))
  (while (= e1 "VERTEX")
    (setq e1 (cdr (assoc 10 dxf)))
    (setq pd (cdr (assoc 70 dxf)))
    (if (/= pd 16)
        (setq count_xy (cons e1 count_xy))
    )
    (setq e1 e2)
    (SETQ E2 (ENTNEXT E1))
    (SETQ DXF (ENTGET E2))
    (setq e1 (cdr (assoc 0 dxf)))
  )
  (setq COUNT_XY (reverse count_xy))
)
;;;;;;;;;;;;;;;;;;;;;;;
(defun LWPOLYLINE (DXF / XY COUNT_XY)
  (SETQ XY (ASSOC 10 DXF))
  (SETQ COUNT_XY ())
  (WHILE XY
    (SETQ DXF (MEMBER XY DXF))
    (SETQ XY (CDR (ASSOC 10 DXF)))
    (SETQ DXF (CDR DXF))
    (SETQ COUNT_XY (CONS XY COUNT_XY))
    (SETQ XY (ASSOC 10 DXF))
  )
  (setq COUNT_XY (reverse COUNT_XY))
)
;;;;;;;;;;;;;
(defun ap-3d->2d (p1 / a b c)
  (setq a (nth 0 p1))
  (setq b (nth 1 p1))
  (setq p1 (list a b))
 )

;;;;;;;;;;;;;;;;;
(DEFUN PDINDX (SST    P1     /     DIST   INDX   B  JD N
        J      K      DIST_SST    MAX_P1 MAX_P2 NAME INDX
        JD_NEAR      MESG
       )
  (SETQ J 0)
  (SETQ P1 (AP-3D->2D P1))
  (SETQ N (SSLENGTH SST))
  (REPEAT N
    (SETQ B (SSNAMEX SST J))
    (SETQ JD (AP-3D->2D (NTH 0 (CDR (NTH 3 (NTH 0 B))))))

    (SETQ NAME (NTH 1 (NTH 0 B)))
    (SETQ DIST (distance p1 jd))
    (SETQ DIST_SST (CONS DIST DIST_SST))
    (SETQ NAME_SST (CONS NAME NAME_SST))
    (SETQ J (1+ J))
  )
  (SETQ J 0)
  (WHILE (/= J (- N 1))
    (SETQ K 0)
    (WHILE (/= K (- N 1))
      (SETQ MAX_P1 (NTH K DIST_SST))
      (SETQ MAX_P2 (NTH (+ K 1) DIST_SST))
      (IF (> MAX_P1 MAX_P2)
 (PROGN
   (SETQ B (CDR (MEMBER MAX_P2 DIST_SST)))
   (SETQ B (CONS MAX_P1 B))
   (SETQ B (CONS MAX_P2 B))
   (SETQ JD (- K 1))
   (REPEAT K
     (SETQ MAX_P1 (NTH JD DIST_SST))
     (SETQ B (CONS MAX_P1 B))
     (SETQ JD (- JD 1))
   )
   (SETQ DIST_SST B)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   (SETQ MAX_P1 (NTH K NAME_SST))
   (SETQ MAX_P2 (NTH (+ K 1) NAME_SST))

   (SETQ B (CDR (MEMBER MAX_P2 NAME_SST)))
   (SETQ B (CONS MAX_P1 B))
   (SETQ B (CONS MAX_P2 B))
   (SETQ JD (- K 1))
   (REPEAT K
     (SETQ MAX_P1 (NTH JD NAME_SST))
     (SETQ B (CONS MAX_P1 B))
     (SETQ JD (- JD 1))
   )
   (SETQ NAME_SST B)
 )
      )
      (SETQ K (1+ K))
    )
    (SETQ J (1+ J))
  )
  (SETQ NAME_SST NAME_SST)
)
;

发表于 2008-4-6 16:00 | 显示全部楼层
INSERT和SHAPE的输出格式如何?
 楼主| 发表于 2008-4-6 17:17 | 显示全部楼层
ZZXXQQ斑竹,如果你有方案,小弟愿闻齐祥............麻烦你了
 楼主| 发表于 2008-4-8 17:20 | 显示全部楼层

怎么都沉下去了呀,请斑主和各位大虾一定帮小弟这个忙啊.谢谢.谢谢.谢谢了

 楼主| 发表于 2008-4-10 21:49 | 显示全部楼层

接棒啊,小弟等到花儿也谢了.............

发表于 2008-4-10 23:32 | 显示全部楼层

二楼的问题怎么不回答?

只知道PolyLine的输出格式,不知道那两种实体的输出格式如何写?

 楼主| 发表于 2008-4-11 18:39 | 显示全部楼层

ZZXXQQ你好,其实我要的程序需要实现这样的功能:

1.输入命令->指定文件输出目录->选取"POLYLINE"(多根)->指定第一根"POLYLINE"序号(默认1)->文件输出->结束

2.数据:要求输出每根"POLYLINE"各节点坐标,数据形式如下:
数据形式如下:
(线)1,x1,y1z1,x2,y2,z2,x3,y3,z3,x4,y4,z4...----(点与点间以逗号隔开)
(线)2,x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4...
(线)3,x1,y1,z1,x2,y2,z2,x3,y3,z3...

请您帮忙编个程序实现它.谢谢

发表于 2008-4-11 18:58 | 显示全部楼层
仅对多义线有效。
  1. (DEFUN C:outh (/ SST H fi N I J K p NAME DXF TYPE_LINE XY_COUNT F x y PT1 D N1)
  2. (setq fi '((0 . "*POLYLINE")))  ; Filter for ssget.
  3. (setq F (getfiled "写出文件" "" "txt" 1))
  4. (SETQ F (OPEN F "w"))
  5. (PROMPT " \n选取等高线:")
  6. (SETQ SST (SSGET fi))
  7. (SETQ J 0)
  8. (setq k 0)
  9. (setq p (getint " \n指定起始点号<1>:"))
  10. (IF (= P nil) (setq p 1))
  11. (REPEAT (SSLENGTH SST)
  12.   (SETQ NAME (SSNAME SST J))
  13.   (SETQ J (1+ J))
  14.   (SETQ DXF (ENTGET NAME))
  15.   (SETQ TYPE_LINE (CDR (ASSOC 0 DXF)))
  16.   (SETQ XY_COUNT (EVAL (READ (STRCAT "(" TYPE_LINE " DXF NAME)"))))
  17.   (setq i (length xy_count))
  18.   (setq k 0)
  19.   (princ "\n" f) (princ p f) (princ "," f)
  20.   (repeat i
  21.    (setq y (nth k xy_count))
  22.    (setq h (nth 2 y))
  23.    (setq x (nth 1 y))
  24.    (setq y (nth 0 y))
  25.    (setq y (strcat (if (> k 0) "," "")(rtos Y 2 3) "," (rtos X 2 3) "," (rtos h 2 3)))
  26.    (princ y f)
  27.    (setq k (1+ k))
  28.   )
  29.   (while (< i 4) (princ ",9999,9999,9999" f) (setq i (1+ i)))
  30.   (setq p (1+ p))
  31. )
  32. (close f)
  33. )
  34. (defun POLYLINE (DXF E1 / XY E2 count_xy pd)
  35. (setq count_xy nil)
  36. (SETQ DXF (MEMBER (ASSOC 330 DXF) DXF))
  37. (SETQ E2 (ENTNEXT E1))
  38. (SETQ DXF (ENTGET E2))
  39. (setq e1 (cdr (assoc 0 dxf)))
  40. (while (= e1 "VERTEX")
  41.   (setq e1 (cdr (assoc 10 dxf)))
  42.   (setq pd (cdr (assoc 70 dxf)))
  43.   (if (/= pd 16) (setq count_xy (cons e1 count_xy)))
  44.   (setq e1 e2)
  45.   (SETQ E2 (ENTNEXT E1))
  46.   (SETQ DXF (ENTGET E2))
  47.   (setq e1 (cdr (assoc 0 dxf)))
  48. )
  49. (setq COUNT_XY (reverse count_xy))
  50. )
  51. ;;;;;;;;;;;;;;;;;;;;;;;
  52. (defun LWPOLYLINE (DXF / XY COUNT_XY)
  53. (SETQ XY (ASSOC 10 DXF))
  54. (SETQ COUNT_XY ())
  55. (WHILE XY
  56.   (SETQ DXF (MEMBER XY DXF))
  57.   (SETQ XY (CDR (ASSOC 10 DXF)))
  58.   (SETQ DXF (CDR DXF))
  59.   (SETQ COUNT_XY (CONS XY COUNT_XY))
  60.   (SETQ XY (ASSOC 10 DXF))
  61. )
  62. (setq COUNT_XY (reverse COUNT_XY))
  63. )
 楼主| 发表于 2008-4-11 21:58 | 显示全部楼层

ZZXXQQ斑竹,上面的程序正是我所要的结果,辛苦了,非常感谢...谢谢

发表于 2008-4-12 00:22 | 显示全部楼层
本帖最后由 作者 于 2008-4-12 0:25:34 编辑

(DEFUN C:ttt (/ E FI I LST P PT SS STR)
  (setq fi '((0 . "*POLYLINE"))) ; Filter for ssget.
  (setq Fn (getfiled "写出文件" "" "txt" 1))
  (SETQ F (OPEN Fn "w"))
  (PROMPT " \n选取等高线:")
  (SETQ SS (SSGET fi))
  (SETQ i -1)
  (IF (not (setq p (getint " \n指定起始点号<1>:")))
    (setq p 1)
  )
  (while (setq i (1+ i)
        e (ssname ss i)
  )
    (setq str (strcat "(线)" (itoa p))
   p   (1+ p)
   ii -1
    )
    (repeat 4
    (if (setq ii (1+ ii)
       pt (vlax-curve-getpointatparam e ii))
      (setq str (strcat str","(rtos (car pt) 2 3)","(rtos (cadr pt) 2 3)","(rtos (caddr pt) 2 3)))
      (setq str (strcat str "," "9999,9999,9999"))
    )
   )
    (setq lst (cons str lst))
  )
  (mapcar '(lambda(x)(write-line x f)) (reverse lst))
  (close f)
  (princ)
)

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-29 01:57 , Processed in 1.492468 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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