MarcoW 发表于 2022-7-6 11:30:21

某些条件的问题

大家好,
 
我正在努力做到这一点:
 
-提示用户浏览特定文件夹(例如,在服务器上共享)
-如果按了escape,或以某种方式取消了命令,则什么也不做,只对“未更改”发出警报。
-如果选择了一个文件夹,则使用结果使其成为新的PrinterStyleSheerDir。
-将当前PrinterStyleSheetDir中的所有文件复制到新文件,并将新文件设置为活动文件。
 
这是我在互联网上得到很多帮助后编写的代码。
 
 

(defun browsefolder (title / shlobj folder fldobj); outval
; If outval is localize it is not working therefore after;

(vl-load-com)
(setq
   shlobj (vla-getinterfaceobject
   (vlax-get-acad-object)
   "Shell.Application"
   )
   folder (vlax-invoke-method shlobj 'browseforfolder 0 title 0)
)
(vlax-release-object shlobj)
(if folder
   (progn
   (setq
fldobj (vlax-get-property folder 'self)
outval (vlax-get-property fldobj 'path)
   )
   (vlax-release-object folder)
   (vlax-release-object fldobj)
   outval
   )
)
)

(browsefolder "Select shared folder")

; until here I have no trouble

(if
(not (= outval nil))
(
(setq cPrinterStyleSheetDir
      (strcat (getenv "PrinterStyleSheetDir") "\\")
)
(foreach file (vl-directory-files cPrinterStyleSheetDir "*.*" 1)
(vl-file-copy
   (strcat cPrinterStyleSheetDir file)
   (strcat outval file)
)
)
(princ)
(setenv "PrinterStyleSheetDir" outval)
); end if not nil
(Alert "No folder selected - nothing changed")
); end if
(princ)

 
这和if条件有关。。。如果我没有选择文件夹(转义或取消),那么没有什么问题。
 
如果我确实选择了一个文件夹,那么即使使用了该文件夹,我仍然会收到2个错误。有人能帮我把这段代码写得更清楚吗?
我的意思是,它确实有效,但有一些令人讨厌的副作用。
 
Tnx准备就绪。

MarcoW 发表于 2022-7-6 11:36:35

哦,是的,我有一些错误:
 
数字1:
; 错误:错误
参数类型:stringp nil
 
2号:
呵呵。。。无法获取它。。。
 
我是舒尔,如果我用所有括号删除if语句,效果会更好。
只有我需要做if语句,以防没有选择文件夹。
Pff。。。

Lee Mac 发表于 2022-7-6 11:45:12

也许是这样的:
 

(defun browsefolder (title / shlobj folder fldobj outval)
(vl-load-com)

(setq shlobj (vla-getinterfaceobject
                (vlax-get-acad-object) "Shell.Application")
       folder (vlax-invoke-method shlobj 'browseforfolder 0 title 0))
(vlax-release-object shlobj)

(if folder
   (progn
   (setq fldobj (vlax-get-property folder 'self)
         outval (vlax-get-property fldobj 'path))
   
   (vlax-release-object folder)
   (vlax-release-object fldobj)

   outval)))


(if (setq folder (browsefolder "Select shared folder"))
(progn

   (setq cPrinterStyleSheetDir
          (strcat (getenv "PrinterStyleSheetDir") "\\"))

   (foreach file (vl-directory-files cPrinterStyleSheetDir "*.*" 1)
   (vl-file-copy
       (strcat cPrinterStyleSheetDir file) (strcat outval file)))

   (setenv "PrinterStyleSheetDir" outval))

(Alert "No folder selected - nothing changed"))

(princ)

 
browsefolder函数的返回为outval,因此您可以在IF语句中对此进行测试。我建议你相信browsefolder函数的作者(如果不是你的话)。
 

Lee Mac 发表于 2022-7-6 11:47:37

马可,
 
我建议您阅读以下内容:
 
http://www.cadtutor.net/forum/showpost.php?p=173196&postcount=10
http://www.cadtutor.net/forum/showpost.php?p=240943&postcount=2
http://www.cadtutor.net/forum/showpost.php?p=273108&postcount=12

MSasu 发表于 2022-7-6 11:57:33

@MarcoW,也要注意使用PROGN语句来分组if/else操作。
 
应该是:
(if (not (= outval nil))
(progn
(setq cPrinterStyleSheetDir
 
而不是:
(if (not (= outval nil))
(
(setq cPrinterStyleSheetDir
 
当做

Lee Mac 发表于 2022-7-6 12:01:52

Msasu,我喜欢你的头像,你可能会喜欢这个帖子

alanjt 发表于 2022-7-6 12:08:17

 
不需要(not(=…)检查。
 
(if outval
(setq cPrinterStyleSheetDir

MarcoW 发表于 2022-7-6 12:12:34

啊,我得到了错误回来(我没有作出outval本地):
 
; 错误:错误函数:“C:\”
(如果选择C:\驱动器)
 
@李:
谢谢你的回复,我会尽快尝试你的代码。
 
如果我知道作者是谁,我会相信他。如果需要的话,我通常会这样做。
 
但是好的,我已经搜索了我的IE浏览历史,这是我从中获得信息的原始线程:
http://forums.augi.com/archive/index.php/t-53632.html

Lee Mac 发表于 2022-7-6 12:18:25

 
正如我所说,Outval不需要是全局的,您可以只测试子函数的返回。

MarcoW 发表于 2022-7-6 12:19:48

@李
我知道不本地化outval是不对的。但我找不到我的解决方案,所以我尝试了一切。。。你的评论我不太清楚。但接下来的赞扬是。。。我现在明白了。
谢谢你的链接:我知道它们,我时不时地读它们。但由于“编程不够”,我一直在失去这些东西。但是我应该知道progn的声明,那是一个错误,我一定是亲眼看到的。
 
@MSASU公司
正如对李所说:是的,节目。。。当然我本应该知道的,但我完全错过了。
 
@Alanjt公司
是的,谢谢。
页: [1] 2
查看完整版本: 某些条件的问题