乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 99|回复: 19

[编程交流] 如何使用导出坐标数据

[复制链接]

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 07:03:31 | 显示全部楼层 |阅读模式
大家好,
 
请容忍我,因为我是Autolisp的相对新手,我已经在互联网上筛选了一个多星期了,试图找到一个Lisp例程,使我能够在图形上拾取点,并在屏幕上自动标记它们的东距和北距。
 
我最终做到了这一点,主要是通过剖析互联网上的其他Lisp例程,并阅读当地图书馆的几本(可能已经过时)书籍。我不确定在修改其他人的例程时是否正确,所以如果我做错了什么,请告诉我。
 
无论如何,下面是到目前为止的Lsip例程,但我一辈子都不知道如何将每组坐标导出到ASCII文件,以便上传到全站仪。
 
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ; IDXYZ.LSP                                                                 ;
  3. ; This routine is based on:                                                 ;
  4. ; TIP #940:  IDXYZ.LSP (C)1994, JOHN R. RICKER                              ;
  5. ; Taken from a post on the AUGI website                                     ;
  6. ;                                                                           ;
  7. ; Example Run    :                                                          ;
  8. ; Enter Desired Text Size ? :                                               ;
  9. ; UNIT type to use [s]cientific [D]ec [A]rchitect [E]ng [F]ract :           ;         
  10. ; Enter number of Decimal Places to use ? < 3 > :                           ;
  11. ; Please pick POINT to ID and label with TEXT...                    <do so> ;
  12. ;   ************* continues until carriage return is hit ***************    ;
  13. ; Please pick POINT to ID and label with TEXT...                    <do so> ;
  14. ;                                                                           ;
  15. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  16. (princ "\Loading IDXY Please Wait..")
  17.   (setvar "CMDECHO" 0)
  18.   (setq OS (getvar "OSMODE"))
  19.   (setq currlay (getvar "clayer"))
  20.   (setq txtstyl (getvar "textstyle"))
  21. (command "style" "UTM" "romans" "0" "1" "0" "N" "N" "N")
  22. (command "Layer" "M" "UTM-Text" "S" "UTM-Text" "")
  23.   ;set trailing zeros to on
  24.   ;
  25.   (initget 1 "S H")
  26.   (setq DMZ
  27.   (getkword
  28.   "\nTrailing Zeros [s]how or [H]ide : "))
  29.   (cond ((= DMZ "S")(setq DMZ 3))
  30.      ((= DMZ "H")(setq DMZ )
  31.   )                                              ; end cond
  32.   (setvar "DIMZIN" DMZ)
  33.   ;
  34.   ; get the text size to use
  35.   ;
  36.   (setq TXTSZ
  37.   (getreal "\n Enter Desired Text Size ? : "))
  38.   ;
  39.   ; get the unit type to display
  40.   ;
  41.   (initget 1 "S D E A F")
  42.   (setq UT
  43.      (getkword
  44.   "\n  UNIT type to use [s]cientific [D]ec [A]rchitect [E]ng [F]ract : "))
  45.   (cond ((= UT "S")(setq UT 1))
  46.      ((= UT "D")(setq UT 2))
  47.      ((= UT "E")(setq UT 3))
  48.      ((= UT "A")(setq UT 4))
  49.      ((= UT "F")(setq UT 5))
  50.   )                                              ; end cond
  51.   ;
  52.   ; get the number of decimal places to use
  53.   ;
  54.   (setq DP
  55.   (getint "\n   Enter number of Decimal Places to use ? < 3 > : "))
  56.   (if (or (= DP "")(= DP nil))(setq DP 3))
  57.   ;
  58.   ; get insertion point first time in...
  59.   ;
  60.   (setq PT
  61.   (getpoint "\n Please pick POINT to ID and label with TEXT... (hit Enter when done) "))
  62.   (while PT   
  63.        (setq VAL1$ (strcat (rtos (car PT) UT DP) "mE"))
  64.        (setq VAL2$ (strcat (rtos (cadr PT) UT DP) "mN"))
  65. (command "TEXT" (polar PT 0 TXTSZ) TXTSZ "0" VAL1$ "text" "" VAL2$)
  66. ;                  (command "TEXT" PT "" VAL1$ "text" "" VAL2$))   
  67. ;
  68. ;
  69. ; get insertion point while in loop
  70.      (setq PT
  71.      (getpoint "\n Please pick POINT to ID and label with TEXT... (hit Enter when done) "))
  72.   )                                              ; end while
  73.   ;
  74.   ; reset OSMODE
  75.   ;
  76.   (setvar "OSMODE" OS)
  77.   (setvar "clayer" currlay)
  78.   (setvar "textstyle" txtstyl)
  79.   (terpri)
  80. )                                                ; end defun
  81. (princ "IDXY Loaded.... Command = IDXY \n")
  82. (princ)
  83. ; end idxy.lsp

 
任何帮助都将不胜感激。
 
干杯
回复

使用道具 举报

10

主题

109

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-6 07:07:23 | 显示全部楼层
我看到没有比他更有能力的人回应了,所以我来了。要将字符串保存在ascii文件中,首先需要使用以下内容声明文件变量:
 
(setq fvar(打开“gpoints.txt”“w”))
 
这可能就在这条线之后:
 
; 首次在中获取插入点。。。
 
然后,要编写字符串,需要如下内容:
 
(写入行VAL1$fvar)
(写入行VAL2$fvar)
 
该对需要出现在定义字符串之后、getpoint语句之前的while循环中。那么就在排队之前呢:
 
; 在循环中获取插入点
 
然后,在while循环关闭后,您需要使用以下命令关闭文件:
 
(关闭fvar)
 
这方面的一个好地方可能是在台词后面:;重置OSMODE
 
 
我希望这能奏效。你发布的代码似乎不完整,至少我找不到开头的DEFUN,所以我无法自己运行和测试它。
我也不知道gpoints在哪里。我的示例中的txt文件实际上位于您的系统上。您可能需要为其定义一个文件夹。
 
关于版权问题,我不是律师,但我想作者不会在乎你如何使用代码,除非你打算出售一个包含他的代码的程序。然后你应该联系他并请求许可。
 
祝你好运。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 07:10:56 | 显示全部楼层
看一看这个,看5分
笔记剪切另一个程序未完成
 
  1. (repeat 5
  2. (setq el (entget))
  3.      (setq ip (cdr (assoc 10 el)))
  4.      (setq en1 (entnext en))
  5.      (setq el1 (entget en1))
  6.      (setq att (cdr (assoc 1 el1)))
  7.      (setq px (rtos (car ip) 2 3))
  8.      (setq py (rtos (cadr ip) 2 3))
  9.      (setq pz (rtos (caddr ip) 2 3))
  10.      (setq pnt (strcat att "," px ", " py ", " pz))
  11.      (write-line pnt filename)
  12. )
回复

使用道具 举报

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 07:13:51 | 显示全部楼层
 
干杯,这似乎起了作用,我已经添加了defun,并把事情整理了一点。
 
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ; IDXYZ.LSP                                                                 ;
  3. ; This routine is based on:                                                 ;
  4. ; TIP #940:  IDXYZ.LSP (C)1994, JOHN R. RICKER                              ;
  5. ; Taken from a post on the AUGI website                                     ;
  6. ;                                                                           ;
  7. ; Example Run    :                                                          ;
  8. ; Trailing Zeros [s]how or [H]ide ?                                         ;
  9. ; Enter Desired Text Size ? :                                               ;
  10. ; UNIT type to use [s]cientific [D]ec [A]rchitect [E]ng [F]ract :           ;         
  11. ; Enter number of Decimal Places to use ? < 3 > :                           ;
  12. ; Please pick POINT to ID and label with TEXT...                    <do so> ;
  13. ;   ************* continues until carriage return is hit ***************    ;
  14. ; Please pick POINT to ID and label with TEXT...                    <do so> ;
  15. ;                                                                           ;
  16. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  17. (princ "\Loading IDXY Please Wait..")
  18.   (defun C:IDXY ( / TYP OS ANS XYZ$ DP DMZ UT currlay txtstyl)
  19.   (setvar "CMDECHO" 0)
  20.   (setq OS (getvar "OSMODE"))
  21.   (setq currlay (getvar "clayer"))
  22.   (setq txtstyl (getvar "textstyle"))
  23. (command "style" "UTM" "romans" "0" "1" "0" "N" "N" "N")
  24. (command "Layer" "M" "UTM-Text" "S" "UTM-Text" "")
  25.   ;
  26.   ; set trailing zeros to on or off
  27.   ;
  28.   (initget 1 "S H")
  29.   (setq DMZ
  30.   (getkword "\nTrailing Zeros [s]how or [H]ide ? : "))
  31.   (cond ((= DMZ "S")(setq DMZ 3))
  32.      ((= DMZ "H")(setq DMZ )
  33.   )                                              ; end cond
  34.   (setvar "DIMZIN" DMZ)
  35.   ;
  36.   ; set the text size to use
  37.   ;
  38.   (setq TXTSZ
  39.   (getreal "\n Enter Desired Text Size ? : "))
  40.   ;
  41.   ; set the unit type to display
  42.   ;
  43.   (initget 1 "S D E A F")
  44.   (setq UT
  45.      (getkword
  46.   "\n  UNIT type to use [s]cientific [D]ec [A]rchitect [E]ng [F]ract : "))
  47.   (cond ((= UT "S")(setq UT 1))
  48.      ((= UT "D")(setq UT 2))
  49.      ((= UT "E")(setq UT 3))
  50.      ((= UT "A")(setq UT 4))
  51.      ((= UT "F")(setq UT 5))
  52.   )                                              ; end cond
  53.   ;
  54.   ; set the number of decimal places to use
  55.   ;
  56.   (setq DP
  57.   (getint "\n   Enter number of Decimal Places to use ? < 3 > : "))
  58.   (if (or (= DP "")(= DP nil))(setq DP 3))
  59.   ;
  60.   ;
  61.   ; get insertion point first time in...
  62.   ;
  63.   ; open file for writing using drawing location and drawing name
  64.   ;
  65.   (setq fname (strcase (strcat (getvar "dwgprefix") (getvar "dwgname") ".xyz")))
  66.   (setq fvar (open fname "a"))
  67.   ;
  68.   ; pick 1st point
  69.   ;
  70.   (setq PT
  71.   (getpoint "\n Please pick POINT to ID and label with TEXT... (hit Enter when done) "))
  72.   (while PT   
  73.   ;
  74.   ; variable for on screen display (inc mE & mN)
  75.   ;
  76.        (setq VAL1$ (strcat (rtos (car PT) UT DP)"mE"))
  77.        (setq VAL2$ (strcat (rtos (cadr PT) UT DP)"mN"))
  78.   ;
  79.   ; variable for output to file
  80.   ;
  81.        (setq OUT1$ (strcat (rtos (car PT) UT DP)))
  82.        (setq OUT2$ (strcat (rtos (cadr PT) UT DP)))
  83.   ;
  84.   (command "TEXT" (polar PT 0 TXTSZ) TXTSZ "0" VAL1$ "text" "" VAL2$)
  85.   ;                  
  86.   ; get insertion point while in loop
  87.   ;
  88.   (write-line (strcat" " OUT1$ " " OUT2$ " " "0") fvar)
  89.   ;
  90.      (setq PT
  91.      (getpoint "\n Please pick POINT to ID and label with TEXT... (hit Enter when done) "))
  92.   )                                              ; end while
  93.   ;
  94.   ; reset OSMODE
  95.    (close fvar)
  96.   ;
  97.   (setvar "OSMODE" OS)
  98.   (setvar "clayer" currlay)
  99.   (setvar "textstyle" txtstyl)
  100.   (terpri)
  101. )                                                ; end defun
  102. (princ "IDXY Loaded.... Command = IDXY \n")
  103. (princ)
  104. ; end idxy.lsp

 
现在唯一要做的就是让用户选择一个点编号,并让它在每次选择一个点时增加一个,你有什么想法吗?
 
我已经用(setq pno(+pno 1))进行了实验,但我不确定它应该具有什么功能,以及(老实说)确切地如何应用它。
 
干杯
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 07:16:40 | 显示全部楼层
您真的需要额外的选项,如“尾随零如何或[H]ide”和“使用cientific[D]ec[A]architect[E]ng[F]ract的单元类型:”?我改变了我的旧例程,现在它绘制点数并将其写入文件。
 
  1. (defun c:oxy(/ fPt oldEcho oldNum dFlc dDec fVar cX cY cNum *error*)
  2. (defun *error*(msg)
  3.      (setvar "CMDECHO" 1)
  4.    (if fVar(close fVar))
  5.    (princ)
  6.    ); end of *error*
  7. (princ(strcat "DIMSCALE="(rtos(getvar "DIMSCALE"))" "
  8.         "DIMLFAC="(rtos(setq dFlc(getvar "DIMLFAC")))" "
  9.         "DIMDEC="(rtos(setq dDec(getvar "DIMDEC")))" "
  10. ); end strcat
  11. ); end princ       
  12. (setvar "CMDECHO" 0)
  13. (if(= 0(getvar "USERI3"))(setvar "USERI3" 1)
  14.    ); end if
  15. (setq cNum(getint(strcat "\nSpecify first point number <"
  16.                         (itoa(getvar "USERI3")) ">: ")))
  17. (if cNum (setvar "USERI3" cNum))
  18. (setq fVar(open(strcase(strcat(getvar "DWGPREFIX")
  19.                          (getvar "DWGNAME") ".xyz")) "a"))
  20. (while
  21.    (setq fPt
  22.    (getpoint
  23.             (strcat "\nSpecify point or Right-Click to Quit <"(itoa(getvar "USERI3"))">: ")))
  24.      (if(vl-cmdf "_.dimordinate" fPt "_t"
  25.          (strcat
  26. "["(itoa(getvar "USERI3"))"]" "\\P"
  27.       (setq cX(rtos(* dFlc(car fPt))2 dDec)) "mE"  
  28.       "\\X"
  29.       (setq cY(rtos(* dFlc(cadr fPt))2 dDec)) "mN"
  30.       ); end strcat
  31.          pause
  32.          ); end vl-cmdf
  33. (progn
  34.   (write-line (strcat " " cX " " cY " " "0")fVar)
  35.   (setvar "USERI3"(1+(getvar "USERI3")))
  36.   ); end progn
  37. ); end if
  38.    ); end while
  39.    (close fVar)
  40.    (setvar "CMDECHO" 1)
  41. (princ)
  42. ); end of c:oxy
  43. (princ "\nType OXY to tag coordinates ")

 
它使用标准DIM坐标标注,并通过标准标注变量DIMSCALE控制标注比例,DIMLFAC控制测量比例,DIMDEC控制小数位数。
回复

使用道具 举报

8

主题

1133

帖子

1164

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 07:21:50 | 显示全部楼层
这是一个很好的常规ASMI,但严格来说,我可以指出下面这行有一个轻微的拼写错误吗
 
(写入线(strcat“cX”cY“0”)fVar)
 
 
可以将计数数变量分配给USERR1吗?这样在以后打开图形时,这些数字就会知道最后一个使用的是什么,下一个数字就会从那里继续,而不是从1开始
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 07:25:13 | 显示全部楼层
谢谢你抓住了这个错误。现在“USERI3”系统变量中的当前数字。这是同情但非专业的,我应该使用字典而不是“USERXX”变量。但是我今天没有更多的时间去做。
回复

使用道具 举报

8

主题

1133

帖子

1164

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 07:26:50 | 显示全部楼层
我知道编辑大师的作品是异端,但如果你改变这行
 
(写入线(strcat“cX”cY“0”)fVar)
 
对于这个
 
(写入行(strcat(itoa(getvar“USERI3”))”,“cX”,“cY”,“0”)fVar)
 
然后输出为csv格式,带有点编号、东距、北距和高程(设置为零),非常适合上传到全站仪
 
所有的努力都是由ASMI完成的-谢谢
回复

使用道具 举报

2

主题

439

帖子

536

银币

限制会员

铜币
-14
发表于 2022-7-6 07:30:14 | 显示全部楼层
谢谢你Eldon。对于*。csv我认为:
 
  1. (setq fVar(open(strcase(strcat(getvar "DWGPREFIX")
  2.                          (getvar "DWGNAME") "[color="#ff0000"].csv[/color]")) "a"))

很高兴帮助你。
回复

使用道具 举报

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 07:32:34 | 显示全部楼层
谢谢各位,
 
我已经稍微调整了ASMI的肉饼,以符合我的目的,现在有一个例行程序来做我需要的一切。如果有人感兴趣,我已经附上了我完成的代码:
 
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ; OXY.LSP                                                                  
  3. ; This routine is designed to display coordinate data on screen with a
  4. ; leader within a new layer and output data to a file for upload to a   
  5. ; Total Station for setout.                                                
  6. ;                                                                           
  7. ; Example Run    :                                                         
  8. ; Trailing Zeros [s]how or [H]ide ?                                         
  9. ; Specify first point number:                                       <do so>
  10. ; Specify point or Right-Click to Quit                              <do so>
  11. ;  ****** continues until mouse left click ******         
  12. ; Specify point or Right-Click to Quit                              <do so>
  13. ;Lsp routine based on one supplied by ASMI on Cadtutor
  14. ;            
  15. ;
  16. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  17. ;
  18. ;
  19. (defun c:oxy(/ fPt oldEcho oldNum dFlc dDec DMZ fVar cX cY cNum *error*)
  20. ;
  21.    (defun *error*(msg)
  22.    (setvar "CMDECHO" 1)
  23.    (if fVar(close fVar))
  24.    (princ)
  25.    ); end of *error*
  26. ;
  27. ;  Routine sets output variables
  28. ;
  29. (princ(strcat "DIMSCALE="(rtos(getvar "DIMSCALE"))" "
  30. "DIMLFAC="(rtos(setq dFlc(getvar "DIMLFAC")))" "
  31. "DIMDEC="(rtos(setq dDec 3))" "
  32. ); end strcat
  33. ); end princ
  34. ;
  35. ;  Routine creates new layer, sets textstyle and inserts data into it
  36. ;
  37. (setq OS (getvar "OSMODE"))
  38.   (setq currlay (getvar "clayer"))
  39.   (setq txtstyl (getvar "textstyle"))
  40. (command "style" "UTM" "romans" "0" "1" "0" "N" "N" "N")
  41. (command "Layer" "M" "Coords" "S" "Coords" "")
  42. ;
  43. ; set trailing zeros to on or off
  44. ;
  45.   (initget 1 "S H")
  46.   (setq DMZ
  47.   (getkword "\nTrailing Zeros [s]how or [H]ide ? : "))
  48.   (cond ((= DMZ "S")(setq DMZ 3))
  49.      ((= DMZ "H")(setq DMZ )
  50.   )                                              ; end cond
  51.   (setvar "DIMZIN" DMZ)
  52. ;
  53. ;
  54. ;
  55. (setvar "CMDECHO" 0)
  56. (if(= 0(getvar "USERI3"))(setvar "USERI3" 1)
  57.    ); end if
  58. ;
  59. ; Specify point number to start
  60. ;  
  61. (setq cNum(getint(strcat "\nSpecify first point number <"
  62.    (itoa(getvar "USERI3")) ">: ")))
  63. (if cNum (setvar "USERI3" cNum))
  64. ;
  65. ; Create new file and open for writing
  66. ;
  67. (setq fVar(open(strcase(strcat(getvar "DWGPREFIX")
  68.     (getvar "DWGNAME") ".xyz")) "a"))
  69. (while
  70.    (setq fPt
  71. ;
  72. ; Click point/s on screen
  73. ;
  74.      (getpoint
  75.             (strcat "\nSpecify point or Right-Click to Quit <"(itoa(getvar "USERI3"))">: ")))
  76.      (if(vl-cmdf "_.dimordinate" fPt "_t"
  77.          (strcat
  78. "["(itoa(getvar "USERI3"))"]" "\\P"
  79.       (setq cX(rtos(* dFlc(car fPt))2 dDec)) "mE"  
  80.       "\\X"
  81.       (setq cY(rtos(* dFlc(cadr fPt))2 dDec)) "mN"
  82.       ); end strcat
  83.          pause
  84.          ); end vl-cmdf
  85. (progn
  86. ;
  87. ;  Write to file
  88. ;  
  89.      (write-line (strcat (itoa(getvar "USERI3")) "," cX "," cY "," "0")fVar)
  90.   (setvar "USERI3"(1+(getvar "USERI3")))
  91.   ); end progn
  92. ); end if
  93.    ); end while
  94.    (close fVar)
  95. ;
  96. ;  Reset to original settings
  97. ;
  98.   (setvar "OSMODE" OS)
  99.   (setvar "clayer" currlay)
  100.   (setvar "textstyle" txtstyl)
  101.   (setvar "CMDECHO" 1)
  102. (princ)
  103. ); end of c:oxy
  104. (princ "\nType OXY to tag coordinates ")

 
再次干杯
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-10 10:32 , Processed in 0.389434 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表