AutoLISP程序给出不一致的结果

时间:2014-08-19 05:12:02

标签: csv autocad autolisp

软件:AutoCAD 2012(日语)

系统:MS Windows 7(日语)


情况

我制作了一个定义新功能的.LSP文件" C:MAKEATABLE"。

它要求用户选择.CSV文件,然后将其数据导入AutoCAD中打开的图形文件。 .CSV文件有两列:

  1. 序列号(整数)
  2. 数据(实数)
  3. .CSV文件的最后一行是" EOF"。

    导入的数据应该是每个文本实体都独立于另一个文本实体,除了它们是以表格方式从用户指定的插入点排列。

    现在,我的问题是每当我加载.LSP文件并调用我的函数时,结果并不总是相同的。 有时值会以所需的方式显示完美;但很多时候,价值观出现了混乱。有三种类型的方法可以使值混乱。

    • 我尝试重启应用程序以及PC,但是没有 果。
    • 我已将所有变量声明为本地变量,因此它们不是 受到干扰。

    以下是完整的代码: 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在屏幕上创建这些文本对象时,它们会占据相同的位置并混淆不清。

    请告诉我哪里可能出错了,我现在该怎么做。

1 个答案:

答案 0 :(得分:0)

我的第一个想法是你需要在运行命令之前关闭osnaps。

(setq orig-osm (getvar "osmode"))
(command "osmode" 0)
... the rest of your command ...
(command "osmode" orig-osm)

根据您的约束,我认为您还可以将表格列生成为mtext(多行文本),并在创建后将它们分别展开以创建单独的文本对象。您可以使用(ssget“L”)对添加到数据库的最后一个元素进行操作。