Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何从Python与AutoCAD交互?_Python 3.x_Autocad_Cad_Autolisp - Fatal编程技术网

Python 3.x 如何从Python与AutoCAD交互?

Python 3.x 如何从Python与AutoCAD交互?,python-3.x,autocad,cad,autolisp,Python 3.x,Autocad,Cad,Autolisp,我有以下AutoLISP代码 (defun graph ( pts sls tls ) ( (lambda ( l ) (foreach x l (text (cdr x) (itoa (car x)) 0.0 1)) (mapcar '(lambda ( a b / p q r ) (setq p (cdr (assoc a l)) q (cdr (assoc

我有以下AutoLISP代码

(defun graph ( pts sls tls )
(   (lambda ( l )
        (foreach x l (text (cdr x) (itoa (car x)) 0.0 1))
        (mapcar
           '(lambda ( a b / p q r )
                (setq p (cdr (assoc a l))
                      q (cdr (assoc b l))
                      r (angle p q)
                )
                (entmake (list '(0 . "LINE") (cons 10 p) (cons 11 q) '(62 . 8)))
                (text
                    (mapcar '(lambda ( x y ) (/ (+ x y) 2.0)) p q)
                    (rtos (distance p q) 2)
                    (if (and (< (* pi 0.5) r) (<= r (* pi 1.5))) (+ r pi) r)
                    2
                )
            )
            sls tls
        )
    )
    (mapcar 'cons (vl-sort (append sls tls) '<) pts)
)
)
(defun text ( p s a c )
    (entmake
        (list
           '(0 . "TEXT")
            (cons 10 p)
            (cons 11 p)
            (cons 50 a)
            (cons 01 s)
            (cons 62 c)
           '(40 . 2)
           '(72 . 1)
           '(73 . 2)
        )
    )
)
从上面创建的二维几何图形将作为dxf文件从AutoCAD导出

实际输入是用Python生成的

pts = [(75, 25), (115, 45), (90, 60), (10, 5), (45, 0), (45, 55), (0, 25)]
sls = [1 1 1 1 2 2 3 4 4 5 6]  
tls = [2 3 4 5 3 6 6 5 7 7 7]
我想知道如何使用python数据类型作为输入,并从python直接与AutoCAD交互,将AutoCAD输出保存为dxf文件

编辑: 我已经在Python中安装了pyautocad,并且

from pyautocad import Autocad, APoint
现在我不知道如何在Python中计算这些AutoCAD表达式。 例如,输入是Python元组

我是否应该使用将每个元组转换为AutoCAD点

p = APoint(x, y)
我不知道在将输入数据生成为autocad点后如何继续。我不清楚这些命令是如何运行的

defun graph ( pts sls tls )

任何建议都将非常有用

可以使用python的子进程库建立接口

"""
Created by Natasha 28/9/2020
-This code passes inputs from python to autocad
ref: https://stackoverflow.com/questions/48794935/batch-run-autolisp-with-python
ref: https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/how-to-interface-with-autocad-from-python/m-p/9768816/highlight/false#M404952
"""
import subprocess

from settings import\
    GRAPH_LISP_FILE,\ # file paths
    GRAPH_SCR_FILE,\
    GRAPH_DWG_FILE,\
    GRAPH_DXF_FILE


def write_src(graph):
    """
    Commands sent to AutoCAD aew
    :param graph:
    :return:
    """
    with open(GRAPH_SCR_FILE, 'w') as outfile:
        outfile.write("open\n" +
                      f"{GRAPH_DWG_FILE}" + "\n"
                      "(setq *LOAD_SECURITY_STATE* (getvar 'SECURELOAD))\n" +
                      '(setvar "SECURELOAD" 0)\n' +
                      rf'(load "{GRAPH_LISP_FILE}")' + "\n"
                      f"{graph}\n" +
                      '(setvar "SECURELOAD" *LOAD_SECURITY_STATE*)\n'
                      "saveas dxf 16\n" +
                      rf"{GRAPH_DXF_FILE}" +"\n"+
                      "quit"
                     )
    pass


def iter_to_lisp_string(list_or_tuple):
    """
    Converts python datatypeS list and tuple to AutoCAD datatype
    :param list_or_tuple:
    :return:
    """
    return "(" + " ".join(map(str, list_or_tuple)) + ")"


if __name__ == '__main__':

    pts_string = "'" + iter_to_lisp_string(map(iter_to_lisp_string, [(75, 25), (115, 45), (90, 60), (10, 5), (45, 0), (45, 55), (0, 25)]))
    sls_string = "'" + iter_to_lisp_string([1, 1, 1, 1, 2, 2, 3, 4, 4, 5, 6])
    tls_string = "'" + iter_to_lisp_string([2, 3, 4, 5, 3, 6, 6, 5, 7, 7, 7])

    graph_command_string = iter_to_lisp_string(["graph", pts_string, sls_string, tls_string])
    write_src(graph=graph_command_string)

    subprocess.run(["C:\\Program Files\\Autodesk\\AutoCAD 2019\\acad.exe", "/b", GRAPH_SCR_FILE])
    print("Process Finished")
"""
Created by Natasha 28/9/2020
-This code passes inputs from python to autocad
ref: https://stackoverflow.com/questions/48794935/batch-run-autolisp-with-python
ref: https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/how-to-interface-with-autocad-from-python/m-p/9768816/highlight/false#M404952
"""
import subprocess

from settings import\
    GRAPH_LISP_FILE,\ # file paths
    GRAPH_SCR_FILE,\
    GRAPH_DWG_FILE,\
    GRAPH_DXF_FILE


def write_src(graph):
    """
    Commands sent to AutoCAD aew
    :param graph:
    :return:
    """
    with open(GRAPH_SCR_FILE, 'w') as outfile:
        outfile.write("open\n" +
                      f"{GRAPH_DWG_FILE}" + "\n"
                      "(setq *LOAD_SECURITY_STATE* (getvar 'SECURELOAD))\n" +
                      '(setvar "SECURELOAD" 0)\n' +
                      rf'(load "{GRAPH_LISP_FILE}")' + "\n"
                      f"{graph}\n" +
                      '(setvar "SECURELOAD" *LOAD_SECURITY_STATE*)\n'
                      "saveas dxf 16\n" +
                      rf"{GRAPH_DXF_FILE}" +"\n"+
                      "quit"
                     )
    pass


def iter_to_lisp_string(list_or_tuple):
    """
    Converts python datatypeS list and tuple to AutoCAD datatype
    :param list_or_tuple:
    :return:
    """
    return "(" + " ".join(map(str, list_or_tuple)) + ")"


if __name__ == '__main__':

    pts_string = "'" + iter_to_lisp_string(map(iter_to_lisp_string, [(75, 25), (115, 45), (90, 60), (10, 5), (45, 0), (45, 55), (0, 25)]))
    sls_string = "'" + iter_to_lisp_string([1, 1, 1, 1, 2, 2, 3, 4, 4, 5, 6])
    tls_string = "'" + iter_to_lisp_string([2, 3, 4, 5, 3, 6, 6, 5, 7, 7, 7])

    graph_command_string = iter_to_lisp_string(["graph", pts_string, sls_string, tls_string])
    write_src(graph=graph_command_string)

    subprocess.run(["C:\\Program Files\\Autodesk\\AutoCAD 2019\\acad.exe", "/b", GRAPH_SCR_FILE])
    print("Process Finished")