SolidWorks二次开发 API-单独导入某个2d图层数据

SolidWorks二次开发 API-单独导入某个2d图层数据

之前在第53个功能中讲过了如何直接导入dxf文件到solidworks的草图中。
今天我们来讲一下如何导入某个图层上的数据,这两个功能所使用的api有区别。
如下图,cad中有三个图层,每个层里有一个形状。

现在我们用代码把图层2 导入到solidworks中。

  var swApp = PStandAlone.GetSolidWorks();

            string partDefaultTemplate = swApp.GetDocumentTemplate((int)swDocumentTypes_e.swDocPART, "", 0, 0, 0);
            
            var newDoc = swApp.NewDocument(partDefaultTemplate, 0, 0, 0);
                        
            var swModel = (ModelDoc2)swApp.ActiveDoc;

            var actPath = RegDllPath("");

            var start = actPath.Substring(0, actPath.IndexOf("CSharpAndSolidWorks", 0));        

            var dwgPath = $@"{start}CSharpAndSolidWorks\CSharpAndSolidWorks\TemplateModel\ImportDWG.dwg";

            bool boolstatus = swModel.Extension.SelectByID2("前视基准面", "PLANE", 0, 0, 0, false, 0, null, 0);
            if (!boolstatus)
            {
                 boolstatus = swModel.Extension.SelectByID2("Front Plane", "PLANE", 0, 0, 0, false, 0, null, 0);

                if (!boolstatus)
                {
                    boolstatus = swModel.Extension.SelectByID2("Front", "PLANE", 0, 0, 0, false, 0, null, 0);

                    if (!boolstatus)
                    {
                        boolstatus = swModel.Extension.SelectByID2("Plane1", "PLANE", 0, 0, 0, false, 0, null, 0);

                        if (!boolstatus)
                        {
                            MessageBox.Show("请选中一个基准面,再点确定。");

                        }           
                        
                    }
                }
            }
         
                       

            ImportDxfDwgData importData = default(ImportDxfDwgData);

            importData = (ImportDxfDwgData)swApp.GetImportFileData(dwgPath);

            importData.set_LengthUnit("", (int)swLengthUnit_e.swMM);
                       
            var bRet = importData.SetPosition("", (int)swDwgImportEntitiesPositioning_e.swDwgEntitiesCentered, 0, 0);
               
            importData.set_ImportMethod("", (int)swImportDxfDwg_ImportMethod_e.swImportDxfDwg_ImportToExistingPart);

            importData.SetMergePoints("", true, 0.001);

            importData.SetImportLayerVisibility(null, (int)swImportDxfDwg_LayerVisibility_e.swImportDxfDwg_LayerHidden);

            var listLayerNames = new List<string>() { "2" };
            var tempArray = listLayerNames.ToArray();
            object layers = tempArray;
            importData.SetImportLayerVisibility(layers, (int)swImportDxfDwg_LayerVisibility_e.swImportDxfDwg_LayerVisible);
               
            var LayFea01 = swModel.FeatureManager.InsertDwgOrDxfFile2(dwgPath, importData);

            if (LayFea01!=null)
            {
                LayFea01.Name = "导入的图层2";
            }
   

执行完成,结果如下图:

是不是很完美,本文结束。我要去看球赛了。

posted @
2022-11-29 19:00 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

SolidWorks二次开发 API-SOLIDWORKS Simulation分析参数修改

SolidWorks二次开发 API-SOLIDWORKS Simulation分析参数修改

今天我们来讲个小例子。
是关于SOLIDWORKS Simulation的。
先说明一点,这东西我也不熟。有问题别问我

首先,我做了一个很难的分析,条件也是很复杂,具体操作我就不说了,分析结果如下:

当然这个图和我们今天要做的事情 关系不大,我们主要了解 一下如何连接到SOLIDWORKS Simulation 上并修改载荷参数,重新运行分析,得到新的结果 。
具体的api查找过滤和之前看帮助类似,我就直接上图了:

下面是关键代码:
把上面的力的大小从100 改成150,然后重新进行风格的划分,运行计算。
`
private void btnSimStudy_Click(object sender, EventArgs e)
{
var actPath = RegDllPath(“”);

        var start = actPath.Substring(0,actPath.IndexOf("CSharpAndSolidWorks",0));
                

        var partPath = $@"{start}CSharpAndSolidWorks\CSharpAndSolidWorks\TemplateModel\Simulation API Demo.SLDPRT";

        SldWorks swApp = PStandAlone.GetSolidWorks();

    
        CWModelDoc swsActDoc = default(CWModelDoc);
        CWStudyManager swsStudyMngr = default(CWStudyManager);
        CWStudy swsStudy = default(CWStudy);
        CWLoadsAndRestraintsManager swsLBCMgr = default(CWLoadsAndRestraintsManager);
        CWForce swsCWForce = default(CWForce); 

        int errors = 0;
        int warnings = 0;
   

        string fileName = partPath;

        // 打开模型
        var swModel = (ModelDoc2)swApp.OpenDoc6(fileName, (int)swDocumentTypes_e.swDocPART, (int)swOpenDocOptions_e.swOpenDocOptions_Silent, "", ref errors, ref warnings);

        // Get the SOLIDWORKS Simulation object
        dynamic COSMOSWORKS = default(dynamic);
        dynamic COSMOSObject = default(dynamic);

        // Determine host SOLIDWORKS major version
        int swVersion = Convert.ToInt32(swApp.RevisionNumber().Substring(0, 2));

        // Calculate the version-specific ProgID of the Simulation add-in that is compatible with this version of SOLIDWORKS
        int cwVersion = swVersion - 15;
        String cwProgID = String.Format("SldWorks.Simulation.{0}", cwVersion);
        Debug.Print(cwProgID);

        // Get the SOLIDWORKS Simulation object
        COSMOSObject = swApp.GetAddInObject(cwProgID);

        COSMOSWORKS = COSMOSObject.CosmosWorks;

        // Open and get active document
        swsActDoc = (CWModelDoc)COSMOSWORKS.ActiveDoc;

        if (swsActDoc == null) ErrorMsg(swApp, "No active document");

        // Create new static study
        swsStudyMngr = (CWStudyManager)swsActDoc.StudyManager;
        if (swsStudyMngr == null) ErrorMsg(swApp, "No CWStudyManager object");

        //得到第一个算例对象
        swsStudy = (CWStudy)swsStudyMngr.GetStudy(0);

        //算例名称,可以区分多个算例   swsStudy.Name



        if (swsStudy == null) ErrorMsg(swApp, "No CWStudy object");

        swsLBCMgr = (CWLoadsAndRestraintsManager)swsStudy.LoadsAndRestraintsManager;

        //get the Force Feature
        //这是是第一个条件,所以参数写0
        var sCwForce = swsLBCMgr.GetLoadsAndRestraints(0, out int errcode);

        if (sCwForce != null)
        {
            var swForce = (CWForce)sCwForce;
        
            swForce.ForceBeginEdit();

            

            //修改值为150
            swForce.NormalForceOrTorqueValue = 150;  
            var res = swForce.ForceEndEdit();

        }

        //Create mesh
        var CwMesh = (CWMesh)swsStudy.Mesh;

        if (CwMesh == null) ErrorMsg(swApp, "No mesh object");

        CwMesh.Quality = 1;
        CwMesh.GetDefaultElementSizeAndTolerance(0, out double el, out double tl);
        var errCode = swsStudy.CreateMesh(0, el, tl);
        if (errCode != 0) ErrorMsg(swApp, "Mesh failed");

        //Run
        swsStudy.RunAnalysis();
    }

    public void ErrorMsg(object swApp, string Message)
    {
        MessageBox.Show(Message);
        MessageBox.Show("'*** WARNING - General");
        MessageBox.Show("'*** " + Message);
        MessageBox.Show("");
    }

`
这样结果出来了,至于怎么拿到最新的结果 ,或者说截图的话后面有机会再讲了。
源码位置:
https://gitee.com/painezeng/CSharpAndSolidWorks

posted @
2022-11-25 20:00 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

C# SolidWorks 二次开发 API-替换工程图视图引用

C# SolidWorks 二次开发 API-替换工程图视图引用

1024-程序员的节日。
但为什么不放假呢?
今天主要是为了拿个徽章,顺便完成这个月的小目标。

这个功能之前提过,感觉好像有很多尺寸的时候关联可能会丢失吧。
但想想这个有些情况还可能用的到,就先写下来充个数吧。

        /// <summary>
        /// 工程图替换文件引用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnReplaceModelForView_Click(object sender, EventArgs e)
        {
            var actPath = RegDllPath("");

            var start = actPath.Substring(0, actPath.IndexOf("CSharpAndSolidWorks", 0));

            var oldPartName = $@"{start}CSharpAndSolidWorks\CSharpAndSolidWorks\TemplateModel\replaceDrawingRef\AA(BB).SLDPRT";

            var newPartName = $@"{start}CSharpAndSolidWorks\CSharpAndSolidWorks\TemplateModel\replaceDrawingRef\AA(BB) - 副本.SLDPRT";

            var swApp = PStandAlone.GetSolidWorks();

            var swModel = (ModelDoc2)swApp.ActiveDoc;

            var docModel = swModel as DrawingDoc;

            var views = (object[])docModel.GetViews();

            List<View> views1 = new List<View>();
            List<Component2> comps1 = new List<Component2>();


            for (int i = 0; i < views.Length; i++)
            {
                var tempV = (object[])views[i];

                if (tempV.Length>1)
                {
                    for (int j =1; j < tempV.Length; j++)
                    {
                        var tempView = (View)tempV[j];
                        if (tempView.RootDrawingComponent.Component!=null)
                        {
                            if (tempView.RootDrawingComponent.Component.IGetModelDoc().GetPathName().ToUpper() == oldPartName.ToUpper())
                            {
                                views1.Add(tempView);
                                comps1.Add(tempView.RootDrawingComponent.Component);
                            }

                        }
                        else
                        {
                            var visComps = (object[])tempView.GetVisibleComponents();

                            if (tempView.GetVisibleComponentCount()==1 && ((visComps[0] as Component2).IGetModelDoc().GetPathName().ToUpper() == oldPartName.ToUpper()))
                            {
                                views1.Add(tempView);
                                comps1.Add(visComps[0] as Component2);
                            }

                        }

                    }

                }


            }

    

            //DispatchWrapper[] viewsIn = new DispatchWrapper[views1.Count];
            //DispatchWrapper[] instancesIn = new DispatchWrapper[views1.Count];




            var res= docModel.ReplaceViewModel(newPartName, views1.ToArray(), comps1.ToArray());

        }

代码就这些了,也就不细讲了。
主要就是遍历所有视图,然后传对应的参考组件,返回替换结果 。

posted @
2022-10-24 17:15 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

C# SolidWorks 二次开发 API-删除工程图中的图片与插入二维码

C# SolidWorks 二次开发 API-删除工程图中的图片与插入二维码

今天有个网友留言说在工程图上删除图片的问题还没解决,说录制可以删除,但再次运行就不行了。
所以就来研究一下工程图里面一些特殊的对象,比如我们截的图,直接粘贴到图纸上的。
想到这个功能,就想到了现在很多企业为了更快的处理信息,会在图纸放上二维一码,在后面通过二维码进行定位,减少输入错误。
作为示例,我就随便拿个图:
第一个功能,删除工程图上之前贴上去的图片。
如下图,一个图片在图纸上,一个图片在图纸格式上。

首先还是录制:

这个可以正常选中图纸上的图片,并可以删除的。只是要先知道图片的位置坐标,不然就会选不中,删除不了 。

通过上面的名称OLEITEM找到了一些方法 GetOLEObjects ,这个就可以直接获取所有OLE对象了,具体什么是OLE,大家可以百度。

有了对象之后 ,我们就比较容易进行删除动作了。

第二部分,开始思路是去创建OLE对象到文档中。
找到了对应的方法CreateOLEObject,但没有成功,因为它里面的参数buffer是MFC的格式,和正常的byte【】不一样。
等后面有空了再研究吧,谁会的麻烦告诉我补全。

那只能想另外的办法了,利用草图里面的插入图片功能。
直接上代码:

 /// <summary>
        /// 获取工程图中的图片对象,删除后插入一个已经存在的二维码
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOLEObject_Click(object sender, EventArgs e)
        {
            var swApp = PStandAlone.GetSolidWorks();

            var swModel = (ModelDoc2)swApp.ActiveDoc;

            //old对象数量
            var oleCountOnThisSheet= swModel.Extension.GetOLEObjectCount((int)swOleObjectOptions_e.swOleObjectOptions_GetOnCurrentSheet);
            //获取 old对象
            var oleObjects = (object[])swModel.Extension.GetOLEObjects((int)swOleObjectOptions_e.swOleObjectOptions_GetOnCurrentSheet);

            //var buf1 = new object();

            //循环 按顺序 选中后删除
            for (int i = 0; i < oleObjects.Count(); i++)
            {
                var oldObj=(SwOLEObject)oleObjects[i];

                Debug.Print(oldObj.Clsid);
                //oldObj.IGetBuffer(oldObj.BufferSize, out byte bData);
                Debug.Print(oldObj.Aspect.ToString());
         
                //buf1 = oldObj.Buffer;

                //选中
                oldObj.Select(false);
               
                //删除
                swModel.EditDelete();
               
            }

            //重新插入一张图片
            //var picPath = @"D:\09_Study\CSharpAndSolidWorks\8888.png";
            swModel.Extension.InsertObjectFromFile(picPath, false, 1, 0.1, 0.1, 0);

            //var pos = new double[] { 0, 0.2, 0.03,0.23};

            //Todo: 如何把文件变成MFC Buffer 

            //var impBuf = imageToByte(image);

            //var newOleObj= swModel.Extension.CreateOLEObject(1, pos, impBuf, out int Err);

            //newOleObj.Refresh();


            #region 利用草图里的插入图片功能

            var picPath = @"D:\09_Study\CSharpAndSolidWorks\v.png";

            var skPic = swModel.SketchManager.InsertSketchPicture(picPath);

            skPic.SetOrigin(0.2, 0.2); //坐标

            skPic.SetSize(0.05, 0.05, true); //大小

            //取消属性显示页
            swApp.RunCommand(-2, "");



            #endregion


            MessageBox.Show("操作完成");

        }

上界面:


执行完成,出结果,看不到吧。
自己测试吧

posted @
2022-10-14 20:15 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

C# SolidWorks 二次开发 API-Solidworks文件关系与打开文件的方式

C# SolidWorks 二次开发 API-Solidworks文件关系与打开文件的方式

今天在草稿中发现了这是去年文章写了一半,没有完成的,那今天就补上吧。

参考关系


这还是官方教程中的两个图片,第一张介绍了solidworks文件之间的引用方向。
这张图可以看出来工程图是最顶级,所以对于工程图来说,改名就是直接在windows资源管理器中改名就可以了,不会影响它的找下级零件或者装配体。
对于零件和装配体,如果修改名称就会比较麻烦,因为很可能引用它的图纸或者上级装配就会找不到旧的文件,这时solidworks就会提示你文件找不到了,让你告诉它新的名称或者路径。 当然solidworks也有个选项可以设置在哪些路径下自动查找。

solidworks找参考文件默认会找同一级,再找引用路径的相对路径,再找绝对路径,再找用户设置的参考文件路径。(我猜的)
文件的改名,移动位置都会影响参考,所以这也是为什么solidworks需要自己有一套打包文件或者改名的功能。
它会自动修正文件的引用。

打开方式


在打开文件的对话框中,选中对应的solidworks文件,下方会出现一些不同的选项,这些可以控制打开的方式。
当前这些是最基础的操作,但有些人不知道。

这几个选项的具体区别大家可以查看官方帮助说明:

有人会肯定会说,又来英文。
没办法,这台电脑是英文系统 。
不过官方有在线的帮助,可以看这里。
https://help.solidworks.com/2018/Chinese-Simplified/SolidWorks/sldworks/AFX_HIDD_FILEOPEN.htm?id=cbc53a63627546abb87b99433a95eacd#Pg0

这里需要说明的是,正常使用api的时候其实都是要以Resolved方式打开文件,因为不加载到内存中的话,很多信息是提取不到的。


这个打开以之前的文章解释过,我就不写代码了。

这里我们再关联讲一下如何检查某个对象的加载状态。

因为很有可能用户是用大型装配体,或者轻化模型打开了模型,你要用代码进行操作的话要先加载到内存才可以。

有个方法可以获取未加载的子件。

Component里的SetComponentState 可以去设置设置对应组件的状态。

今天就不写代码了,太简单了。

posted @
2022-09-29 19:20 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

C# SolidWorks二次开发—工程图中心标记(Center Marks)

C# SolidWorks二次开发—工程图中心标记(Center Marks)

工程图的中心标记

作为一个不专业的制图人员,我就不解释中心标记是什么了。大家自己看Solidworks的官方帮助说明(好像不应该放英文的,大家都看不懂了
)。


就是这么个东东。
我自己画了一个非常复杂的图纸,创建主视图的时候好像就自动增加了中心标记,蛮智能的。

不过上面的和我们今天在学习的没有什么关系,我们先看一下怎么删除这些中心标记,要用代码哈。
先找找api的内容:
找到了一个接口,里面就有例子。
但是看了下,它讲了,中心标记现在是annotations,以前是features.
所以针对不同的版本的solidworks可能是不同的对象。
当然我们是新版的,肯定是annotation了. 那其实就是遍历注释了,然后再判断是不是属于center mark


那下面开始干活.

一、遍历中心标记

		   //请先打开HolePlate.slddrw文件

            var swApp = PStandAlone.GetSolidWorks();

            var swModel = (ModelDoc2)swApp.ActiveDoc;

            var swDrawing = (DrawingDoc)swModel;

            //这里改成工程图中的视图名称

            swDrawing.ActivateView("Drawing View1");

            #region 遍历并删除
            //得到视图对象
            var swView = (View)swDrawing.ActiveDrawingView;

            //获取所有注释
            var annos = (object[])swView.GetAnnotations();

            //清空选择
            swModel.ClearSelection();

            //遍历中心标记
            foreach (var anno in annos)
            {
                var tempAnno = (Annotation)anno;
                if (tempAnno.GetType() == (int)swAnnotationType_e.swCenterMarkSym)
                {
                    //选中
                    tempAnno.Select(true);

                }

            }

            //删除选中
            swModel.EditDelete();
            #endregion

二、自动增加中心标记

增加的话非常简单,就一行代码,里面参数说明如下图:

         #region 自动增加
            //增加中心标记

            swView.AutoInsertCenterMarks2((int)swAutoInsertCenterMarkTypes_e.swAutoInsertCenterMarkType_Slots| (int)swAutoInsertCenterMarkTypes_e.swAutoInsertCenterMarkType_Hole , (int)swCenterMarkConnectionLine_e.swCenterMark_ShowLinearConnectLines, true, true, true, 0.0025, 0.0025, true, true, 0);

            #endregion

执行完所有的代码,结果如下图,因为我们参数里写了slot也增加中心标记,所以现在上面都有了。


总结

以上就是今天的所有内容了,最后再贴个漂亮的UI。

我又骗人了。

源码自取:
https://gitee.com/painezeng/CSharpAndSolidWorks

posted @
2022-09-21 20:00 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源