therock005 发表于 2022-7-5 16:13:51

直接运行DCL

我对编程一无所知,但我想这些文件是从内部调用的。lsp例程对吗?我在办公室浏览一些旧文件夹,发现了一些旧cad安装的dcl文件。我可以在没有lisps或cad环境对话框的情况下运行它们吗?因为这些东西现在是遗留下来的,我甚至不知道原始设置在哪里,也不知道它们是如何产生的

ziele_o2k 发表于 2022-7-5 16:21:37

也许这就是你想要的:
http://www.afralisp.net/dialog-control-language/tutorials/preview-dcl-files.php

therock005 发表于 2022-7-5 16:23:05

嗯,这是向前迈出的一步。当我这样做的时候,我得到了gui对话框,但是那里的按钮没有与命令链接。
 
有没有办法了解按钮和命令之间的关系

ziele_o2k 发表于 2022-7-5 16:28:59

仅通过分析代码

therock005 发表于 2022-7-5 16:31:27

这是一项艰巨的工作。有没有其他工具或对话框可以帮助我完成这段美丽的旅程

rlx 发表于 2022-7-5 16:37:26

试试这个:
 




; Preview Dcl written by Rlx on 30-jun-2017 for CadTutor

(defun c:RlxPreviewDcl ( / dcl-source-folder dcl-filenames dcl-dialognames key-list current-dcl-file)
(RlxPreviewDcl_Init)
(RlxPreviewDcl_StartMainDialog)
(RlxPreviewDcl_Exit)
(princ)
)
(defun RlxPreviewDcl_Init ()
(vl-load-com)
)
(defun RlxPreviewDcl_Exit ()
(princ "\ndone")
)
(defun RlxPreviewDcl_CreateMainDialog ( )
(if (and (setq main-fn (vl-filename-mktemp ".dcl")) (setq main-fp (openmain-fn "w")))
   (write-line
   (strcat "RlxPreviewDialog:dialog{label=\"Rlx Preview Dialog - Rlx(2017)\";"
         ":boxed_row{label=\"Source Folder\";:edit_box{key=\"eb_dcl_source_folder\";edit_width=40;}"
         ":button{label=\" >> \";key=\"bt_dcl_source_folder\";}}spacer;"
         ":boxed_row{: list_box{label=\"Dcl Files\";key=\"lb_dcl_filenames\";height=12;}"
            ": list_box{label=\"Dialog Names\";key=\"lb_dcl_dialognames\";height=12;}}spacer;ok_cancel;}") main-fp))
(if main-fp (close main-fp))(gc)
)
(defun RlxPreviewDcl_InitMainDialog ( / i )
; if previous
(if (and dcl-source-folder (vl-file-directory-p dcl-source-folder))
   (set_tile "eb_dcl_source_folder" dcl-source-folder))
(if (vl-consp dcl-filenames)
   (progn (start_list "lb_dcl_filenames")(mapcar 'add_list dcl-filenames)(end_list)))
(if (and current-dcl-file (setq i (vl-position current-dcl-file dcl-filenames)))
   (set_tile "lb_dcl_filenames" (itoa i))(set_tile "lb_dcl_filenames" (setq i "0")))
(if (and current-dcl-file (findfile current-dcl-file))
   (RlxPreviewDcl_FindDialogs current-dcl-file))
)
;ment for cache option but it works good enough without
(defun RlxPreviewDcl_FindDialogs ( $fn / )
(princ); for now do nothing
)
; test (RlxPreviewDcl_FindKeys ": toggle { label = \"Inspoint\"; key = \"tg_match_att_inspoint\";}")
; 34 = ascii code for "
(defun RlxPreviewDcl_FindKeys ( $str / str )
(if (and (setq i1 (vl-string-search "key" (strcase $str t)))
      (setq i2 (vl-string-position 34 $str i1))(setq i3 (vl-string-position 34 $str (1+ i2))))
   (setq str (substr $str (+ i2 2) (- i3 i2 1))))
str
)
(defun RlxPreviewDcl_MainDialogActions ()
(action_tile "bt_dcl_source_folder" "(RlxPreviewDcl_SelectDclSourceFolder)")
   (action_tile "eb_dcl_source_folder" "(RlxPreviewDcl_CheckManualInputSourceFolder $value)")
   (action_tile "lb_dcl_filenames" "(RlxPreviewDcl_SelectDclSourceFile $value )")
       ;(action_tile "lb_dcl_dialognames" "(setq dialog-name (nth (atoi $value) dcl-dialognames))")
(action_tile "lb_dcl_dialognames" "(RlxPreviewDcl_SelectDialogName (nth (atoi $value) dcl-dialognames))")
         (action_tile "accept" "(done_dialog 1)"))
(defun RlxPreviewDcl_StartMainDialog ( / main-fn main-fp main-dcl drv dialog-name)
(RlxPreviewDcl_CreateMainDialog)
(if (and (setq main-dcl (load_dialog main-fn)) (new_dialog "RlxPreviewDialog" main-dcl))
   (progn(RlxPreviewDcl_InitMainDialog) (RlxPreviewDcl_MainDialogActions) (setq drv (start_dialog))))
(if main-dcl (unload_dialog main-dcl)) (if (and main-fn (findfile main-fn))(vl-file-delete main-fn))
(if (and (= drv 1) dialog-name (/= dialog-name ""))(RlxPreviewDcl_SelectDialogName dialog-name ))
)
(defun RlxPreviewDcl_SelectDclSourceFolder ( / dir)
(if (setq dir (RlxPreviewDcl_SelectFolder "Select folder containing the .dcl files"))
   (progn (setq dcl-source-folder dir)(set_tile "eb_dcl_source_folder" dcl-source-folder)(RlxPreviewDcl_UpdateListBoxes))))
(defun RlxPreviewDcl_SelectFolder ( msg / sh objFolder objParentFolder strPath)
(setq sh (vla-getInterfaceObject (vlax-get-acad-object) "Shell.Application" ))
(setq objFolder (vlax-invoke sh 'BrowseForFolder 0 msg 0 ""))
(if objFolder
(and
    (setq strTitle (vlax-get objFolder "Title"))
    (setq objParentFolder (vlax-get objFolder 'ParentFolder))
    (setq strPath (vlax-get (vlax-invoke objParentFolder "Parsename" strTitle) "Path"))
    (vlax-release-object objParentFolder)(vlax-release-object objFolder))
   (vlax-release-object sh)
)
(if strPath (strcase (vl-string-translate "\\" "/" strPath) t))
)
(defun RlxPreviewDcl_UpdateListBoxes ( / lst)
(cond
   ((null dcl-source-folder))
   ((not (vl-file-directory-p dcl-source-folder)))
   (t
    (if (setq lst (vl-directory-files dcl-source-folder "*.dcl" 1))(setq dcl-filenames lst)(setq dcl-filenames '("No dcl files")))
    (start_list "lb_dcl_filenames")(mapcar 'add_list dcl-filenames)(end_list)
   )
)
)

(defun RlxPreviewDcl_SelectDclSourceFile ( $index / fp-dcl txt key)
(setq current-dcl-file (strcat dcl-source-folder "/" (nth (atoi $index) dcl-filenames)))
; reset dialog key & name list (for now) , later maybe create cache list
(setq dcl-dialognames '() key-list '())
; dcl-filenames
(if (setq fp-dcl (open current-dcl-file "r"))
   (while (setq txt (read-line fp-dcl))
   ; scan each line for buttons, boxes whatever and get key
   (if (setq key (RlxPreviewDcl_FindKeys txt)) (setq key-list (cons key key-list)))
   ; now search for dialog names
   (if (vl-string-search "dialog" (strcase txt t))
(progn
(setq txt (SplitStr txt " "))
(if (/= (car txt) "//")(setq dcl-dialognames (cons (car txt) dcl-dialognames))))
   )
   )
)
(if fp-dcl (close fp-dcl))
(if (vl-consp dcl-dialognames)
   (progn
   (setq dcl-dialognames (reverse (vl-remove "" dcl-dialognames)))
   (start_list "lb_dcl_dialognames")(mapcar 'add_list dcl-dialognames)(end_list)))
)

(defun RlxPreviewDcl_SelectDialogName ($dialog-name / fn dialog tmp-dcl)
; you can print error per case with this construct
(cond
   ((null $dialog-name))
   ((null current-dcl-file))
   ((null (setq fn (findfile current-dcl-file))))
   ((null (setq tmp-dcl (load_dialog fn))))
   ((null (new_dialog $dialog-name tmp-dcl)))
   (t (activate_action_tiles)(start_dialog)(if tmp-dcl (unload_dialog tmp-dcl)))
)
)
; every dialog is different so how can I make sure I hit the right key... mmm , what would a dragon do?
; easy , i get all keys (RlxPreviewDcl_FindKeys) and let every key close the dialog
(defun activate_action_tiles ( / key )
(foreach key key-list (action_tile key "(done_dialog)"))
(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 1)")
)
(defun SplitStr ( s d / p )(if (setq p (vl-string-search d s))(cons (substr s 1 p) (SplitStr (substr s (+ p 1 (strlen d))) d)) (list s)))

(c:RlxPreviewDcl)

gr.Rlx

rlx 发表于 2022-7-5 16:42:55

我已经更新了我的代码(从昨天开始的第6个帖子)。这个应该表现得好一点。
 
只需选择包含dcl文件的文件夹。在左侧的列表框中,您将找到所有dcl文件,当您在左侧列表框中选择一个文件时,您将在右侧列表框中获得所有对话框名称。只需选择对话框名称,就会出现新对话框。任何按钮都会将其关闭,您可以立即选择下一个对话框名称或其他dcl文件。快乐的
 
Gr.Rlx
 
https://www.cadtutor.net/forum/attachment.php?attachmentid=61638&cid=1&stc=1

therock005 发表于 2022-7-5 16:45:32

非常感谢你,我的朋友,我感谢你的帮助。这确实帮助我调出每个可用的对话框,看看后面有什么,但当我搜索安装文件夹时,我找不到任何对话框。lsp文件,只有一些。exe子程序必须是调用对话和包含函数的子程序,但似乎没有设置,我无法将它们链接到实际代码。。

rlx 发表于 2022-7-5 16:51:51

 
 
不幸的是,正如ziele_o2k所说,我们无法在这方面帮助您,因为您必须拥有实际的源代码。我这样做的另一个原因是,我工作的autocad文件夹受到保护,所以我无法使用内置预览。不过,对于预览许多dcl文件来说,这很方便:-)至少你有一些指示,显示了哪些程序(或在哪里)以及它们曾经的外观。
 
 
gr.Rlx

therock005 发表于 2022-7-5 16:52:45

是的,我真的很感谢你,朋友,保重
页: [1] 2
查看完整版本: 直接运行DCL