一.SolidWorks二次開(kāi)發(fā)之 文檔操作和設(shè)置

訪問(wèn)項(xiàng)目 Github倉(cāng)庫(kù)

查看在線文檔

使用Nuget:

PM> Install-Package Du.SolidWorks -Version 0.1.1

本節(jié)源碼

1.如何打開(kāi)一個(gè)文檔

SolidWorks Api 在SldWorks接口中為我們提供了很多OpenDoc方法來(lái)打開(kāi)一個(gè)SolidWorks文件或者SolidWorks兼容的文件,如下


i文檔打開(kāi)方法

我使用的為2016版的幫助文檔,文檔中指示OpenDoc - OpenDoc4 已經(jīng)是Obsolete狀態(tài),表示新版本中已經(jīng)不在推薦使用,在Api演進(jìn)過(guò)程中已經(jīng)是過(guò)時(shí)Api.

使用 OpenDoc6打開(kāi)文檔

1.1打開(kāi)文檔

這里使用c#的擴(kuò)展方法封裝了一個(gè)靜默打開(kāi)文檔的方法,這里隱藏了OpenDoc6的很多參數(shù),只使用了一個(gè)路徑字符串和一個(gè)用來(lái)控制文檔是否可見(jiàn)的bool值.

        /// <summary>
        /// 靜默模式打開(kāi)隱藏文件
        /// </summary>
        /// <param name="app"><see cref="ISldWorks"/></param>
        /// <param name="filePath">文件路徑</param>
        /// <param name="Hidden">是否隱藏 默認(rèn)隱藏</param>
        /// <returns></returns>
        public static ModelDoc2 OpenInvisibleDocClient(this SldWorks app, string filePath, bool Hidden = true)
        {
            int Errors = -1, Warning = -1;
            var type = app.FileType(filePath);
            try
            {
                if (Hidden) app.DocumentVisible(false, (int)type);

                ModelDoc2 doc = app.OpenDoc6(filePath, type.SWToInt(), swOpenDocOptions_e.swOpenDocOptions_Silent.SWToInt(),
                    "", ref Errors, ref Warning) as ModelDoc2;

                if (doc == null)
                {
                    throw new Exception(string.Format("errors:{0},warings{1}",
                        Errors.CastObj<swFileLoadError_e>().ToString(),
                        Warning.CastObj<swFileLoadWarning_e>().ToString()));
                }

                return doc;
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                app.DocumentVisible(true, (int)type);
            }
        }

下面根據(jù)文件路徑判斷SolidWorks文檔類型的方法

        /// <summary>
        /// 判斷文件類型
        /// </summary>
        /// <param name="app"><see cref="ISldWorks"/></param>
        /// <param name="filePath">文件全路徑</param>
        /// <returns></returns>
        public static swDocumentTypes_e FileType(this SldWorks app, string filePath)
        {
            string extension = Path.GetExtension(filePath).ToLower();
            swDocumentTypes_e type = swDocumentTypes_e.swDocPART;
            switch (extension)
            {
                case ".sldprt":
                    type = swDocumentTypes_e.swDocPART;
                    break;
                case ".sldasm":
                    type = swDocumentTypes_e.swDocASSEMBLY;
                    break;
                case ".slddrw":
                    type = swDocumentTypes_e.swDocDRAWING;
                    break;
                default:
                    throw new FileFormatException("不支持的文件類型:" + extension);
            }
            return type;
        }

1.2.只讀打開(kāi)

除了靜默打開(kāi),我們有時(shí)候會(huì)在后臺(tái)打開(kāi)一個(gè)文件作為數(shù)據(jù)庫(kù)使用,像草圖輪廓庫(kù),特征數(shù)據(jù)庫(kù)等.這時(shí)我們可以使用只讀模式打開(kāi).下面的方法封裝了OpenDoc7 來(lái)實(shí)現(xiàn)一個(gè)只讀打開(kāi).

        /// <summary>
        /// 以不可見(jiàn)模式打開(kāi)文檔  Open a document invisibly. It will not be shown to the user but you will be
        /// able to interact with it through the API as if it is loaded.
        /// </summary>
        /// <param name="sldWorks"></param>
        /// <param name="toolFile"></param>
        /// <param name="visible">是否對(duì)用戶可見(jiàn)</param>
        /// <param name="type"><see cref="swDocumentTypes_e"/> SolidWorks 文件類型 ,默認(rèn)為零件</param>
        /// <returns></returns>
        public static ModelDoc2 OpenInvisibleReadOnly(this ISldWorks sldWorks, string toolFile, bool visible = false, swDocumentTypes_e type = swDocumentTypes_e.swDocPART)
        {
            try
            {
                if (!visible)
                    sldWorks.DocumentVisible(false, (int)type);
                var spec = (IDocumentSpecification)sldWorks.GetOpenDocSpec(toolFile);
                if (!visible)
                {
                    spec.Silent = true;
                    spec.ReadOnly = true;
                }
                var doc = sldWorks.OpenDoc7(spec);

                doc.Visible = visible;
                return doc;
            }
            finally
            {
                if (!visible)
                    sldWorks.DocumentVisible
                        (true,
                            (int)
                                type);

            }
        }

1.3.遍歷打開(kāi)的文檔

SolidWorks提供了 GetDocuments 方法來(lái)獲取所有打開(kāi)的文檔,其中包括在內(nèi)存中打開(kāi)并對(duì)用戶不可見(jiàn)的文檔,這立封裝了一個(gè)方法,來(lái)遍歷所有的文檔并執(zhí)行同一操作.

        /// <summary>
        /// 對(duì)內(nèi)存中所有文檔進(jìn)行操作
        /// </summary>
        /// <param name="swApp"></param>
        /// <param name="action"></param>
        public static void UsingOpenDoc(this SldWorks swApp, Action<IModelDoc2> action)
        {
            var docs = (swApp.GetDocuments() as Object[]).Cast<IModelDoc2>();

            if (docs == null)
            {
                return;
            }

            foreach (var item in docs)
            {
                action?.Invoke(item);
            }
        }

1.4.判斷文檔是否已經(jīng)打開(kāi)

有時(shí)在打開(kāi)前我們需要判斷是否已經(jīng)打開(kāi)此文檔,雖然對(duì)已經(jīng)打開(kāi)的文檔再次打開(kāi)SolidWorks也會(huì)返回到ModelDoc2對(duì)象,但有時(shí)判斷一下還是很有必要.下面的方法便是對(duì)上面遍歷所有文檔的再次封裝來(lái)實(shí)現(xiàn)判斷此文檔是否已經(jīng)被打開(kāi).實(shí)現(xiàn)如下:

        /// <summary>
        /// 判斷此文檔是否打開(kāi)
        /// </summary>
        /// <param name="app"></param>
        /// <param name="DocFilePathName"></param>
        /// <returns></returns>
        public static bool HasDocOpened(this SldWorks app, string DocFilePathName)
        {
            bool exist = false;
            app.UsingOpenDoc(d =>
            {
                if (d.GetPathName() == DocFilePathName)
                {
                    exist = true;
                }
            }
            );
            return exist;
        }

1.5.對(duì)當(dāng)前打開(kāi)的活動(dòng)文檔執(zhí)行動(dòng)作

對(duì)當(dāng)前活動(dòng)文檔執(zhí)行某些操作是相當(dāng)普遍的做法,下面的方法使用了一個(gè) Action類型的參數(shù)來(lái)對(duì)活動(dòng)文檔快速調(diào)用.適合一些對(duì)活動(dòng)文檔的快速操作.

        /// <summary>
        /// 對(duì)活動(dòng)文檔進(jìn)行操作
        /// </summary>
        /// <param name="swApp"></param>
        /// <param name="action"></param>
        public static void UsingActiveDoc(this SldWorks swApp, Action<IModelDoc2> action)
        {
            if (swApp.ActiveDoc != null)
            {
                action?.Invoke((IModelDoc2)swApp.ActiveDoc);
            }
        }

2.新建SolidWorks零件或者裝配體

2.1.調(diào)用默認(rèn)模板創(chuàng)建零件或者裝配體

在對(duì)SolidWorks開(kāi)發(fā)中,新建一個(gè)零件或者裝配體是再經(jīng)常不過(guò)的高頻操作,下面的方法封裝了一個(gè)創(chuàng)建文檔的操作,并針對(duì)中文環(huán)境下SolidWork默認(rèn)模板文件命名變換的情況做了判斷處理.

        /// <summary>
        /// 以默認(rèn)設(shè)置的模板創(chuàng)建文檔
        /// </summary>
        /// <param name="sldWorks"><see cref="ISldWorks"/></param>
        /// <param name="type"><see cref="swDocumentTypes_e"/></param>
        /// <returns></returns>
        public static IModelDoc2 CreateDocument(this ISldWorks sldWorks, swDocumentTypes_e type)
        {
            string templatePath = string.Empty;
            switch (type)
            {
                case swDocumentTypes_e.swDocPART:
                    templatePath = sldWorks.GetUserPreferenceStringValue((int)swUserPreferenceStringValue_e.swDefaultTemplatePart);
                    break;
                case swDocumentTypes_e.swDocASSEMBLY:
                    templatePath = sldWorks.GetUserPreferenceStringValue((int)swUserPreferenceStringValue_e.swDefaultTemplateAssembly);
                    break;
                case swDocumentTypes_e.swDocDRAWING:
                    templatePath = sldWorks.GetUserPreferenceStringValue((int)swUserPreferenceStringValue_e.swDefaultTemplateDrawing);
                    break;
                default:
                    break;
            }

            if (!File.Exists(templatePath))
            {
                templatePath =
                    Path.GetDirectoryName(templatePath) + "\\" +
                    Path.GetFileName(templatePath).
                    Replace("零件", "gb_part").
                    Replace("裝配體", "gb_assembly").Replace("工程圖", "gb_a1");
            }

            if (!File.Exists(templatePath))
            {
                throw new FileNotFoundException("無(wú)法找到SolidWorks文件--" + templatePath);
            }

            return sldWorks.CreateDocument(templatePath);
        }

2.2.通過(guò)模板新建文檔

上面我們通過(guò)獲取SolidWorks默認(rèn)設(shè)置的模板來(lái)新建一個(gè)零件或者裝配體,下面我們通過(guò)一個(gè)給定的模板路徑來(lái)新建一個(gè)零件或者裝配體。

        /// <summary>
        /// 通過(guò)模板創(chuàng)建新零件或者新項(xiàng)目
        /// </summary>
        /// <param name="app"></param>
        /// <param name="TemFilePath">*.asmdot 或者 *.prtdot</param>
        /// <returns></returns>
        public static ModelDoc2 NewPartOrAssembly(this SldWorks app, string TemFilePath)
        {
            return app.NewDocument(TemFilePath, (int)swDwgPaperSizes_e.swDwgPaperA4size, 100, 100) as ModelDoc2;
        }

3.修改SolidWorks設(shè)置

獲取SolidWorks設(shè)置選項(xiàng)的基本方法在ISldWorks接口下,如下


獲取SolidWorks設(shè)置選項(xiàng)

修改SolidWorks設(shè)置選項(xiàng)的方法也在ISldWorks接口下掀宋,大概與獲取相對(duì)應(yīng)昙读,如下:
修改SolidWorks設(shè)置項(xiàng)

3.1 先獲取設(shè)置項(xiàng)驶悟,執(zhí)行完需要的代碼后焊夸,將選項(xiàng)設(shè)置為默認(rèn)狀態(tài)

下面的代碼演示了如何在某種狀態(tài)下執(zhí)行我們的業(yè)務(wù)代碼苛败,然后將設(shè)置選項(xiàng)還原到默認(rèn)狀態(tài)水孩,以達(dá)到不隨意改變用戶設(shè)置的要求镰矿。

        /// <summary>
        /// 設(shè)置一個(gè)選項(xiàng)后執(zhí)行動(dòng)作,執(zhí)行完后設(shè)置回系統(tǒng)默認(rèn)值
        /// </summary>
        /// <param name="app">ISldwork interface</param>
        /// <param name="toggleSetting">需要設(shè)置的枚舉值</param>
        /// <param name="value">值</param>
        /// <param name="action">執(zhí)行的動(dòng)作</param>
        public static void WithToggleState(this ISldWorks app, swUserPreferenceToggle_e toggleSetting, bool value, Action action)
        {
            try
            {
                bool fileLockState = app.GetUserPreferenceToggle(toggleSetting.SWToInt());
                app.SetUserPreferenceToggle(swUserPreferenceToggle_e.swLockRecentDocumentsList.SWToInt(), true);
                action?.Invoke();
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                app.SetUserPreferenceToggle(toggleSetting.SWToInt(), value);
            }
        }

下一篇:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市荷愕,隨后出現(xiàn)的幾起案子衡怀,更是在濱河造成了極大的恐慌棍矛,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抛杨,死亡現(xiàn)場(chǎng)離奇詭異够委,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)怖现,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)茁帽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人屈嗤,你說(shuō)我怎么就攤上這事潘拨。” “怎么了饶号?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵铁追,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我茫船,道長(zhǎng)琅束,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任算谈,我火速辦了婚禮涩禀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘然眼。我一直安慰自己艾船,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布高每。 她就那樣靜靜地躺著屿岂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪觉义。 梳的紋絲不亂的頭發(fā)上雁社,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音晒骇,去河邊找鬼。 笑死磺浙,一個(gè)胖子當(dāng)著我的面吹牛洪囤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撕氧,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瘤缩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了伦泥?” 一聲冷哼從身側(cè)響起剥啤,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锦溪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后府怯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體刻诊,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年牺丙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了则涯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冲簿,死狀恐怖粟判,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情峦剔,我是刑警寧澤档礁,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站吝沫,受9級(jí)特大地震影響事秀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜野舶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一易迹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧平道,春花似錦睹欲、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至冀墨,卻和暖如春闸衫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诽嘉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工蔚出, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虫腋。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓骄酗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親悦冀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子趋翻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • SolidWorks開(kāi)發(fā)之Linq初探 一.何為L(zhǎng)inq 語(yǔ)言集成查詢(英語(yǔ):Language Integrate...
    dududuwei閱讀 842評(píng)論 0 4
  • 前言前言 隨著科學(xué)技術(shù)的飛速發(fā)展和科學(xué)技術(shù)的日新月異,產(chǎn)品更新?lián)Q代的速度也越來(lái)越快盒蟆,復(fù)雜零件的個(gè)數(shù)也越來(lái)越多踏烙,產(chǎn)...
    穆山閱讀 1,879評(píng)論 0 10
  • 行動(dòng)已經(jīng)結(jié)束了师骗,但生活仍在繼續(xù),在行動(dòng)里面養(yǎng)成的微習(xí)慣將會(huì)延續(xù)到生活當(dāng)中讨惩。
    絮言ZXR閱讀 114評(píng)論 0 0
  • 中國(guó)歷史上最多情的作家曹雪芹辟癌,在紅樓中選美,在夢(mèng)中選美步脓,在美中選美愿待,在女人中選女人,把天下的女人給寫(xiě)絕了靴患,把女性美...
    徐徳懷閱讀 1,021評(píng)論 0 3
  • 初中時(shí)代首次讀到辛棄疾的“少年不識(shí)愁滋味仍侥,愛(ài)上層樓,愛(ài)上層樓鸳君,為賦新詞強(qiáng)說(shuō)愁”农渊,實(shí)在是不以為然。不是少年或颊,...
    遲朝生閱讀 514評(píng)論 3 10