言戲無軍 发表于 2018-8-24 16:13:07

Lsp vlx fas程序自动加载程序 支持xp ~win10 32及64位系统

本帖最后由 言戲無軍 于 2018-8-26 07:08 编辑

本程序用于发布已开发的CAD lsp程序,将你的lsp或vlx fas放到文件夹下,
或者通过inno setup安装后运行文件夹下apploader就能选择加载程序,后期再次运行可卸载
win10 win8 win7 64位系统都需要管理员权限运行
1.二次开发程序很多用秋风的打包程序,但是不开源,有秋枫的印记,很不爽,不便于发布专业的程序。
2.还有通过拖动lsp到CAD窗口加载的,在win10下有些不能拖动加载,而且太不专业。
3.还有一些用的CAD werx(已倒闭)的inst.exe程序,不支持64位系统。
4.用innosetup脚本直接在安装时候选择CAD加载,如果不想加载某个CAD,得重新安装程序,麻烦。



经过多年的开发探索,终于找到比较齐全的方案,本方案支持64位及32位系统以及CAD,便于发布,便于定制自己的自动加载程序。
此程序分别用了C# .net和VB进行开发,容易修改深化。
此方案的最大好处是便于结合innosetup发布程序 ,安装结束【run】字段运行此程序加载
在不同的CAD,后期想更换CAD再次运行程序可卸载更换,不用重新安装。
最重要的是完全开源,想怎么改怎么改。

关于inno setup发布CAD二次开发程序 百度即可。

VB源码已公布在本论坛 VB及VBA区。
程序完善后将公布所有源码,许多代码借用了网络资源,在此表示感谢。
目前已知有一个问题,就是首次打开CAD,会自动加载2次lsp,找不到解决办法,求大神改改。
C# net源码
namespace LspLoad._17
{
    using Autodesk.AutoCAD.ApplicationServices;
    using Autodesk.AutoCAD.DatabaseServices;
    using Autodesk.AutoCAD.EditorInput;
    using Autodesk.AutoCAD.Runtime;
    using Autodesk.AutoCAD.Windows;
    //using DotNetARX;
// using Autodesk.AutoCAD.Interop;
    //using Autodesk.AutoCAD.Interop.Common;
    using System;
    using System.Text;
    //using System.Drawing;
    using System.IO;
    using System.Runtime.InteropServices;
   // using System.Windows.Forms;
    using System.Diagnostics;

    public class ExtApp : IExtensionApplication
    {
      
      
      
      extern static private int ads_queueexpr(string strExpr);

      



      public void AppLoad(string ex)
      {
            Document mdiActiveDocument = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor editor = mdiActiveDocument.Editor;
          // AcadApplication app = (AcadApplication)Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication;
         
            //Application.ShowAlertDialog(ThisNetProperty.Path_LispLocation.ToString());
            if (Directory.Exists(ThisNetProperty.Path_LispLocation))
            {
               
                try
                {
                  string[] files = Directory.GetFiles(ThisNetProperty.Path_LispLocation, ex,SearchOption.TopDirectoryOnly);
                  
                  foreach (string str in files)
                  {
                        editor.WriteMessage(str);
                         //editor.Command("(vl-load-all" + ("\"" + str.Replace(@"\", "/") + "\"") + ")");
                        ads_queueexpr("(vl-load-all" + ("\"" + str.Replace(@"\", "/") + "\"") + ")(princ)\n");
                        //Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.SendStringToExecute("(vl-load-all" + ("\"" + str.Replace(@"\", "/") + "\"") + ")\n", true, false, true);
                     // app.ActiveDocument.SendCommand("(vl-load-all" + ("\"" + str.Replace(@"\", "/") + "\"") + ")\n");
                     // app.ActiveDocument.SendCommand("(vl-load-all" + ("\"" + str.Replace(@"\", "/") + "\"") + ")\n");
                     
                  }
                }
                catch (Autodesk.AutoCAD.Runtime.Exception exception)
                {

                  Application.ShowAlertDialog(exception.ToString());
                }

            }
            
      }
      
      
      

      private void DocumentManager_DocumentCreated(object sender, DocumentCollectionEventArgs e)
      {

         // AppLoad("*.lsp");

            //Application.DocumentManager.DocumentCreated -= new DocumentCollectionEventHandler(DocumentManager_DocumentCreated);
      }

      public void Initialize()
      {
            Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(Autodesk.AutoCAD.ApplicationServices.Application.Version.ToString());
            ThisNetProperty.LoadPath();
            // Application.DocumentManager.DocumentCreated += new DocumentCollectionEventHandler(DocumentManager_DocumentCreated);

            //this.LoadEvents();
            //Editor editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            // Application.SetSystemVariable("cmdecho", 0);
            // DocumentLock docLock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument();




            AppLoad("*.lsp");
            AppLoad("*.vlx");
            AppLoad("*.fas");


      }
      
      


      public void LoadEvents()
      {
      }

   


      

      public void Terminate()
      {
      }
    }
}

apploader 源码
有人不知道如何在lsp里面添加支持路径及菜单,引用下秋枫、夜未眠的自动加载lsp,自己修改下,就行了,程序里定义了一个lsp函数
(get_apppath)用于获取 apploader所在路径。
秋枫及夜未眠源码加载菜单及支持路径:
;;;部分代码转自mjtd
;;; 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
;;; 判断是否加载本文件
(if (car (atoms-family 1 '("vl-load-com")))
(vl-load-com)
(progn
    (Alert
      "这个程序集是为AutoCAD 2000以及更高的版本设计的,有些功能有可能在没有Visual Lisp for R14支持的AutoCAD R14上不能正确地运行。"
    )
    (exit)      ; 版本不符,退出加载。
)
)

;;; 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
;;; 取得本程序的路径
(defun GetPath (AppID)
;;(vl-registry-read
; ; (strcat
; ;   "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"
; ;   AppID
;;    "_is1"
   ; )
;;"Inno Setup: App Path"
;; )
;;;;(get_apppath) 为apploader自定义的lsp函数,可以获取apploader运行的路径;;;
(car (get_apppath))

)

(defun GetmylyPath () (GetPath "图层管理中心"))

;;; 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
;;; 解析字符串为表
(defun strParse(Str Delimiter / SearchStr StringLen return n char)
(setq SearchStr Str)
(setq StringLen (strlen SearchStr))
(setq return '())
(while (> StringLen 0)
    (setq n 1)
    (setq char (substr SearchStr 1 1))
    (while (and (/= char Delimiter) (/= char ""))
      (setq n (1+ n))
      (setq char (substr SearchStr n 1))
    )
    (setq return (cons (substr SearchStr 1 (1- n)) return))
    (setq SearchStr (substr SearchStr (1+ n) StringLen))
    (setq StringLen (strlen SearchStr))
)
(reverse return)
)

;;; 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
;;; 反解析表为字符串
(defun StrUnParse (Lst Delimiter / return)
(setq return "")
(foreach str Lst
    (setq return (strcat return Delimiter str))
)
(substr return 2)
)

;;; 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
;;; 移除支持文件搜索路径
(defun QF_RemoveSupportPath (PathToRemove / supportlist)
(setq supportlist (strparse (getenv "ACAD") ";"))
(setq supportlist (vl-remove "" supportlist))
(setqsupportlist
   (vl-remove-if
   '(lambda (x) (= (strcase x) (strcase PathToRemove)))
   supportlist
   )
)
(setenv "ACAD" (strUnParse supportlist ";"))
)

;;; 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
;;; 添加支持文件搜索路径
;;; 第二个参数如果为真, 插最前,否则插最后

(defun AddSupportPath (PathToAdd isFirst / supportlist)
(QF_RemoveSupportPath PathToAdd)
(setq supportlist (strparse (getenv "ACAD") ";"))
(setq supportlist (vl-remove "" supportlist))
(if isFirst
    (setq supportlist (cons PathToAdd supportlist))
    (setq supportlist (append supportlist (list PathToAdd)))
)
(setenv "ACAD" (strUnParse supportlist ";"))
)

;;; 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
;;; 加载菜单
(defun load-mymenu (/ n)
(if (not (menugroup "mlayer"))
    (progn (setq n 1)
   (while (< n 24)
       (if (menucmd (strcat "P" (itoa n) ".1=?"))
         (setq n (+ n 1))
         (progn (if (> n 3)
      (setq n (- n 2))
      (setq n 3)
          )
          (command "menuload" "tuceng")
          (menucmd (strcat "p" (itoa n) "=+mlayer.pop111"))
          (setq n 25)
         )
       )
   )
    )
)
(princ)
)

;;; 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
;;; 初始化主函数
(defun Init_mylayer ()
(if (not (menugroup "mlayer")); 如果菜单组还没有被加载,则加载之
    (progn (AddSupportPath (GetmylyPath) nil) ; 添加支持路径
   (AddSupportPath (strcat (GetmylyPath) "\\LISP") nil)
   (AddSupportPath (strcat (GetmylyPath) "\\LIB") nil)
   (AddSupportPath (strcat (GetmylyPath) "\\BIN") nil)
   (load-mymenu)
    )
)
(princ)
)

;;; 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
;;; 主程序:
(princ "\n加载图层管理中心菜单……")

(setq cmdecho_save (getvar "cmdecho"))
(setvar "cmdecho" 0)

;;; 执行初始化
(Init_mylayer)

(setvar "cmdecho" cmdecho_save)
(setq cmdecho_save nil)

(princ "\n图层管理中心菜单 α版 加载完毕。")
(princ)








taoyi0727 发表于 2018-8-25 09:01:43


(defun loadmapp()
        (load "D:\\cad\\123.fas")
        (alert "加载程序成功.")
)
(loadmapp)

就是像这样用吗?把要加载的东西放到这里
但是为什么要弹出窗口2次,就像alert运行了2次一次不知道为什么?

pop159 发表于 2018-9-30 16:10:57

taoyi0727 发表于 2018-8-25 09:01
(defun loadmapp()
        (load "D:\\cad\\123.fas")
        (alert "加载程序成功.")


请问,要手动将插件的路径添加到里面吗,有一百个就要写一百遍吗,那不是也麻烦啊

言戲無軍 发表于 2018-8-25 13:18:37

taoyi0727 发表于 2018-8-25 09:01
(defun loadmapp()
        (load "D:\\cad\\123.fas")
        (alert "加载程序成功.")


目前就是有这个bug,找不到解决办法,加载程序里不添加窗口提示就好,在.net里加

xxxkkk331 发表于 2018-8-24 16:19:52

关注一波,谢谢楼主

taoyi0727 发表于 2018-8-25 08:47:49

都是专业的呀!C# .net VB 啥都有
只会lisp看着都不会用

spp_wall 发表于 2018-8-25 10:39:29

学习 学习!!!!!!!!!!!!

taoyi0727 发表于 2018-8-25 13:22:32

不会 只会点lisp 望哪位高手能改改

言戲無軍 发表于 2018-8-25 15:54:17

taoyi0727 发表于 2018-8-25 13:22
不会 只会点lisp 望哪位高手能改改

你在加载文件里只加载函数和菜单,不要有alert 和princ之类的文字,提示没问题的,即使加载两次用户也不知道,对程序没影响

xiaotao 发表于 2018-8-25 20:17:41

试了下 这个不错!想添加一些用户支持搜索路径不知道怎么弄,期待下个版本。

蓝盾设计 发表于 2018-8-26 23:48:54

好东西学习学习!
页: [1] 2 3
查看完整版本: Lsp vlx fas程序自动加载程序 支持xp ~win10 32及64位系统