软件:AutoCAD 2012(日语)
系统:MS Windows 7(日语)
我制作了一个定义新功能的.LSP文件" C:MAKEATABLE"。
它要求用户选择.CSV文件,然后将其数据导入AutoCAD中打开的图形文件。 .CSV文件有两列:
.CSV文件的最后一行是" EOF"。
导入的数据应该是每个文本实体都独立于另一个文本实体,除了它们是以表格方式从用户指定的插入点排列。
现在,我的问题是每当我加载.LSP文件并调用我的函数时,结果并不总是相同的。 有时值会以所需的方式显示完美;但很多时候,价值观出现了混乱。有三种类型的方法可以使值混乱。
以下是完整的代码: Pastebin link also available
(defun c:makeatable ( / filename csvfile startpt data rdline digits lineno currentpt datapt datarelpt baserelpt indexbasept temp2 temp3 temp4 temp5 wide1 wide2 rowheight txtheight tempvar tmps)
(setq filename (getfiled "Data File" "C:/Temp/drawings/" "csv" 128)) ;prompt user to open the file containing the data
(setq csvfile (open filename "r")) ;open the file to read its contents
(setq startpt (getpoint "\n Table insertion point: ")) ;prompt user to choose the insertion point
;------------;prompt user to input the parameters; if nil, default value is set;--------------------------;
;
;** This code is useful when default values are needed, so that the user doesn't have to enter them. **;
;** If the values appear jumbled, kindly run the program again with appropriate values. **;
;** **;
(initget (+ 2 4))
(if (not(setq txtheight (getreal "\n Enter Text height: ")))
(setq txtheight 4.0)
)
(princ)
(initget (+ 2 4))
(if (not(setq wide1 (getreal "\n Enter first column width: ")))
(setq wide1 15.0)
)
(princ)
(initget (+ 2 4))
(if (not(setq wide2 (getreal "\n Enter second column width: ")))
(setq wide2 30.0)
)
(princ)
(initget (+ 2 4))
(if (not(setq rowheight (getreal "\n Enter Row height: ")))
(setq rowheight 7.0)
)
(princ)
;----------------------------------------------------------------------------------------------------------;
(setq lineno 1) ;this var stores the line at which the program is currently at
(setq digits 0) ;this var stores the (number of digits - 1) of the index
(setq currentpt startpt) ;initialize currentpt
;-------*------temporary variables for the arrangement of the data------*-------;
(setq temp2 (/ (+ rowheight txtheight) 2))
(setq temp3 (+ wide1 (* txtheight 2)))
(setq temp4 (+ wide1 (/ wide2 5)))
(setq temp5 (- wide1 (/ wide1 20)))
(setq tempvar (list 0 (* -1 rowheight) 0))
;-------------------------------------------------------------------------------;
(setq datarelpt (list temp4 temp2 0)) ;these are relative points;
(setq baserelpt (list temp5 temp2 0))
;------------------------------;while loop;-------------------------------------;
(while (/= rdline "EOF")
(cond ((> lineno 9) ;check the number of ;
(setq digits 1) ;digits in the index ;
)
((> lineno 99)
(setq digits 2)
)
);end cond
(setq datapt (mapcar '+ ;these lines ;
currentpt ;set the coordinates ;
datarelpt ;for the data ;
) ; ;
)
(setq indexbasept (mapcar '+ ;these lines ;
currentpt ;set the coordinates ;
baserelpt ;for the index ;
) ; ;
)
(setq rdline (read-line csvfile)) ;read a line from the CSV file
(setq data (substr rdline (+ 3 digits)));extract the data from the read line
(setq tmp (command "STYLE" "MONO" "MONOTXT" "" "" "" "" "" "")) ;makes the text monospace
;-----------------------------printing the values-----------------------;
(command "text" datapt txtheight 0 data) ;write the data
(command "text" "_j" "_r" indexbasept txtheight 0 lineno) ;write the index number
;-------------------------------------------------------------------;
(setq lineno (1+ lineno)) ;increment line number
(setq currentpt (mapcar '+ ;increment the ;
currentpt ;current point ;
tempvar ;coordinates ;
) ; ;
)
)
;------------------------------;while loop ends;------------------------------------;
(entdel (entlast)) ;to remove the extra index number printed at the end
(close csvfile) ;close the opened file
(princ) ;clean exit
)
我甚至检查了插入文本的点[使用(princ datapt)
和(princ indexbasept)
],并发现它们正常。但是,当AutoCAD在屏幕上创建这些文本对象时,它们会占据相同的位置并混淆不清。
请告诉我哪里可能出错了,我现在该怎么做。
答案 0 :(得分:0)
我的第一个想法是你需要在运行命令之前关闭osnaps。
(setq orig-osm (getvar "osmode"))
(command "osmode" 0)
... the rest of your command ...
(command "osmode" orig-osm)
根据您的约束,我认为您还可以将表格列生成为mtext(多行文本),并在创建后将它们分别展开以创建单独的文本对象。您可以使用(ssget“L”)对添加到数据库的最后一个元素进行操作。