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)
(defun loadmapp()
(load "D:\\cad\\123.fas")
(alert "加载程序成功.")
)
(loadmapp)
就是像这样用吗?把要加载的东西放到这里
但是为什么要弹出窗口2次,就像alert运行了2次一次不知道为什么? taoyi0727 发表于 2018-8-25 09:01
(defun loadmapp()
(load "D:\\cad\\123.fas")
(alert "加载程序成功.")
请问,要手动将插件的路径添加到里面吗,有一百个就要写一百遍吗,那不是也麻烦啊 taoyi0727 发表于 2018-8-25 09:01
(defun loadmapp()
(load "D:\\cad\\123.fas")
(alert "加载程序成功.")
目前就是有这个bug,找不到解决办法,加载程序里不添加窗口提示就好,在.net里加 关注一波,谢谢楼主 都是专业的呀!C# .net VB 啥都有
只会lisp看着都不会用 学习 学习!!!!!!!!!!!! 不会 只会点lisp 望哪位高手能改改 taoyi0727 发表于 2018-8-25 13:22
不会 只会点lisp 望哪位高手能改改
你在加载文件里只加载函数和菜单,不要有alert 和princ之类的文字,提示没问题的,即使加载两次用户也不知道,对程序没影响 试了下 这个不错!想添加一些用户支持搜索路径不知道怎么弄,期待下个版本。 好东西学习学习!