C# ObjectArx cad二次開發

来源:http://www.cnblogs.com/onegarden/archive/2016/06/14/5583432.html
-Advertisement-
Play Games

1 環境搭建:安裝CAD 和objectArx庫,這裡安裝的是cad2012和objectArx2010 ,vs是2010 2 新建一個類庫項目,引用objectArx安裝目錄下inc文件夾下的AcDbMgd.dll和AcMgd.dll,這裡註意X86和X64系統的區別 3 添加兩個類,一個繼承IE ...


1   環境搭建:安裝CAD 和objectArx庫,這裡安裝的是cad2012和objectArx2010 ,vs是2010

2   新建一個類庫項目,引用objectArx安裝目錄下inc文件夾下的AcDbMgd.dll和AcMgd.dll,這裡註意X86和X64系統的區別

3   添加兩個類,一個繼承IExtensionApplication介面,這個是dll的入口,cad會從這個類載入程式做一些初始化的操作;另外一個可以寫自定義的一些cad命令

cad的引用:

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Windows;
using Autodesk.AutoCAD.Interop;
using Autodesk.AutoCAD.Interop.Common;

可以添加程式集目錄,方便快速載入,其中兩個類,第一個類標識為入口繼承IExtensionApplication介面,第二個類為自定義的命令

[assembly: ExtensionApplication(typeof(cadObjArx.CADExetensionCls))]
[assembly: CommandClass(typeof(cadObjArx.CADCommandS))]

代碼:

這裡只做兩個簡單的例子,更加深入的需要看cad的開發手冊。。。。。

namespace cadObjArx
{
    public class CADExetensionCls : IExtensionApplication
    {
        public void Initialize()
        {//載入dll的時候執行相關載入操作

            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            ed.WriteMessage("\n載入cadObjArx\n");
            load();
        }

        public void Terminate()
        {//這個是推出時執行
            Document doc = Application.DocumentManager.MdiActiveDocument;
            doc.LockDocument(DocumentLockMode.NotLocked, "", "", false);
        }
        private void load()
        {   //這裡添加一個工具條,添加一個按鈕綁定下麵的InitT命令
       //這個是通過引用cad的com組件實現的,需要引用cad的Autodesk.AutoCAD.Interop和Autodesk.AutoCAD.Interop.Common兩個com組件, AcadMenuGroups menugroups
= (AcadMenuGroups)Application.MenuGroups; AcadToolbar toolbar = menugroups.Item(0).Toolbars.Add("Test"); AcadToolbarItem item = toolbar.AddToolbarButton(toolbar.Count, "InitT", "測試", "InitT\n"); item.SetBitmaps("設置16x16.bmp", "設置32x32.bmp"); toolbar.Dock(AcToolbarDockStatus.acToolbarDockTop); } } public class CADCommandS { [CommandMethod("InitT",CommandFlags.Modal)]//特性標識,標識這個是cad命令 public void Init() {//這裡做個測試,命令行中輸出一句話,按下上面添加的按鈕或者在命令行中輸入命令就會被執行 Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; ed.WriteMessage("測試init\n"); } [CommandMethod("ListEntities")] public void ListEntities() {//這個是遍歷當前cad打開的文檔中的對象//在命令行中寫命令即可執行 Document acDoc = Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { BlockTable acBlkTbl; acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; BlockTableRecord acBlkTblRec; acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord; int nCnt = 0; acDoc.Editor.WriteMessage("\nModel space objects: "); foreach (ObjectId acObjId in acBlkTblRec) { acDoc.Editor.WriteMessage("\n" + acObjId.ObjectClass.DxfName +":"+ acObjId.Handle.Value.ToString()); nCnt = nCnt + 1; } if (nCnt == 0) { acDoc.Editor.WriteMessage("\nNo objects found."); } else { acDoc.Editor.WriteMessage("\nTotal {0} objects.", nCnt); } } } } }

 

4   調試,在項目屬性中,設置調試->啟動外部程式,指定cad的啟動路徑,指定工作目錄為當前程式的生成目錄,既可調試。

這裡每次調試後,都要在啟動cad後,通過netload命令載入dll,比較麻煩,可以在上面的工作目錄下添加一個lsp腳本文件cad2012.lsp,裡面添加一條載入的語句(command "netload" "cadObjArx.dll")

這樣每次啟動調試後,cad為自動載入目錄下的cadObjArx.dll。

還有一個問題,因為上面引用了兩個objectArx的庫,系統預設會把這兩個庫複製到生成目錄下,會導致莫名奇妙的載入失敗,設置成不輸出後,就正常了。

5  部署,可以再建一個可執行程式的項目,通過調用com組件的方式來啟動cad和載入dll,也可以用上面那個方式吧lsp腳本文件和要使用的cad文件放在同一目錄下,cad為自動執行腳本

下麵通過一個控制台程式啟動cad並載入dll

        Console.WriteLine("start..");
            string sProgID = "AutoCAD.Application.18.2";
            try
            {
                if (System.Diagnostics.Process.GetProcessesByName("acad").Count() > 0)//判斷當前有沒cad在運行
                {
                    Console.WriteLine("獲取打開的cad");
                    acApp = (AcadApplication)Marshal.GetActiveObject(sProgID);//獲取當前運行的cad對象
                }
                else
                {
                    Console.WriteLine("open cad");
                    acApp = new AcadApplication();//沒有直接建一個
                    acApp.Visible = true;
                }
            }
            catch (Exception exc)
            {
                Console.WriteLine(exc.Message);
            }

            if (acApp != null)
            {
                Console.WriteLine("netload begin ");
                try
                {//載入dll
                    string dllPath = @"D:\workspace\test\cadObjArx\bin\Debug\cadObjArx.dll";
                    string sCommand = "(command \"netload\" \"{0}\")\n";
                    dllPath = dllPath.Replace("\\", "\\\\");
                    acApp.ActiveDocument.SendCommand(string.Format(sCommand, dllPath));

                }
                catch (Exception exload)
                {
                    Console.WriteLine("netload err:{0}", exload.Message);

                }
            }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • linux系統中通過which命令可以查看命令所在路徑和別名 ...
  • 使用vim打造IDE, 針對C語言開發者建議使用gvim 先上兩個截圖 # 安裝ctags1. 下載地址: http://ctags.sourceforge.net/# 安裝cscope1. 下載地址: http://cscope.sourceforge.net/ 2. 修改源碼,使其支持遞歸搜索文 ...
  • 1.首先安裝nfs-kernel-server apt-get install nfs-kernel-server 2.然後創建一個目錄: mkdir -p /opt/share 並賦予許可權777: chmod -R 777 /opt/share 3.在/etc/exports文件中添加配置:(打開 ...
  • 使普通用戶也能使用wireshark轉包 > 創建wireshark組 sudo groupadd wireshark> 將dumpcap加入wireshark組 sudo chgrp wireshark /usr/bin/dumpcap> 使wireshark有許可權使用dumpcap sudo c ...
  • locate命令可以快速搜索文件,與find不同,locate直接檢索系統維護的資料庫。 ...
  • linux系統中通過find命令來查找文件,該命令有眾多參數,這裡只是列舉了一些常見用法。 ...
  • Linux下運行的Web伺服器Apache,預設日誌文件是不分割的,一個整文件既不易於管理,也不易於分析統計。安裝cronolog後,可以將日誌文件按時間分割,易於管理和分析。 cronolog安裝配置非常簡單,下載後只需要輸入幾個命令即可完成。 1、下載(最新版本) 如果這個鏈接失效,請上這個鏈接 ...
  • 總結一下上一個項目中對webapi 用戶登錄許可權控制的設計 目的:前端可以根據介面的狀態碼來判斷用戶的登錄狀態,以及訪問許可權 1.首先我們在webconfig裡面添加一條配置,用於開啟或關閉許可權控制 2.先瞭解一下 ActionFilterAttribute 這個類,該類可以在action方法執行前 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...