C# SolidWorks 二次开发 API — 在工程图中获取模型

C# SolidWorks 二次开发 API — 在工程图中获取模型

最近两周比较忙,没怎么写新的博客,昨天有网友问到如何在工程图中获取零件相关属性。今天就把步骤写下来,之前有一篇博文已经写过如何遍历视图了,其实只需要获取视图中的模型就可以,这样就可以像在零件或者装配环境中操作了。

今天我们来个简单一点的:

请打开一个工程图,并选中其中一个视图。

这后点击工具上的按钮,就会提示零件的路径。

 

 

 private void GetDrawingModel_Click(object sender, EventArgs e)
        {
            //连接到Solidworks
            ISldWorks swApp = Utility.ConnectToSolidWorks();

            ModelDoc2 swModel = (ModelDoc2)swApp.ActiveDoc;

            // DrawingDoc dc = (DrawingDoc)swModel;

            SelectionMgr selectionMgr = (SelectionMgr)swModel.SelectionManager;

            //获取选择的视图对象
            View view = (View)selectionMgr.GetSelectedObject5(1);

            //获取视图中的引用模型
            var viewModel = view.ReferencedDocument;

            //其它读取属性请参考博文 读取零件属性 ->BtnGetPartData_Click

            MessageBox.Show(viewModel.GetPathName());
        }

 

posted @
2019-12-10 09:12 
painezeng  阅读(
130)  评论(
0
编辑 
收藏 
举报

C# SolidWorks 二次开发 API — 利用射线选择相对面

C# SolidWorks 二次开发 API — 利用射线选择相对面

最近的项目中需要用到一个新的功能,在用户选择了一个面的情况下,找到此面的对面那个面。用来在这两个面上创建一对特征。

如下图,需要选中红色箭头中的那个面:

通过测试,可以通过 SelectByRay这个函数来获取。

意思是在某个点,画一条射线,看哪个面与它相交。

需要注意的是,如果一个轴线上有很多个相交面它会选择最后一个.

private void btn_SelectByRay_Click(object sender, EventArgs e)
        {
            //连接到Solidworks
            ISldWorks swApp = Utility.ConnectToSolidWorks();

            ModelDoc2 swModel = (ModelDoc2)swApp.ActiveDoc;

            Face2 swSelFace = default(Face2);
            SelectionMgr swSelMgr = (SelectionMgr)swModel.SelectionManager;

            //获取选择数据
            SelectData swSelData = default(SelectData);

            swSelData = swSelMgr.CreateSelectData();

            swSelFace = (Face2)swSelMgr.GetSelectedObject6(1, 0);

            var t = (double[])swSelFace.Normal;

            //获取屏幕鼠标选择的那个点
            var mousePoint = (double[])swSelMgr.GetSelectionPoint2(1, 0);

            swModel.ClearSelection2(true);

            //创建Ray选择

            var boolstatus = swModel.Extension.SelectByRay(mousePoint[0], mousePoint[1], mousePoint[2], t[0], t[1], t[2], 0.1, 2, false, 0, 0);

            if (boolstatus == true)
            {
                MessageBox.Show("选择完成!");
            }
        }

 

 

posted @
2019-11-25 13:53 
painezeng  阅读(
101)  评论(
0
编辑 
收藏 
举报

C# SolidWorks 二次开发 API — 实例:打包文件

C# SolidWorks 二次开发 API — 实例:打包文件

我们开发的程序使用过程中经常要使用一些做好的模板,尤其是参数化的时候,这样就难免有一些文件需要从指定的地方复制过来,或者说还要把文件名替换掉,还可以加一些前缀或者后缀。这个例子也只是一个最简单的打包方案,当然大家还可以参考API帮助文件中的Pack And Go函数来打包文件。

        /// <summary>
        /// 不打开文件,复制文件
        /// </summary>
        /// <param name="sourcefile">源文件路径</param>
        /// <param name="target">目标文件</param>
        /// <param name="ReplaceFrom">需要替换的文件</param>
        /// <param name="ReplaceTo">替换成什么</param>
        /// <param name="likeFile">是否模糊匹配</param>
        /// <param name="ReplaceFrom2">替换字符2</param>
        /// <param name="ReplaceTo2">第二次替换成什么</param>
        /// <param name="likeFile2">模糊匹配?</param>
        public void CopySolidworksFile(string sourcefile, string target, string ReplaceFrom = "", string ReplaceTo = "", bool likeFile = true, string ReplaceFrom2 = "", string ReplaceTo2 = "", bool likeFile2 = false)
        {
            ISldWorks swApp = Utility.ConnectToSolidWorks();

            target = System.IO.Path.GetDirectoryName(target) + @"\";

            int sourcecount = 0;

            string[] sourcefiles = null;

            string[] targetfiles = null;

            object[] depends;

            var sourcefileName = System.IO.Path.GetFileName(sourcefile);
            var oldSourcefiles = sourcefiles;
            sourcefiles = new string[sourcecount + 1];
            if (oldSourcefiles != null)
                Array.Copy(oldSourcefiles, sourcefiles, Math.Min(sourcecount + 1, oldSourcefiles.Length));
            var oldTargetfiles = targetfiles;
            targetfiles = new string[sourcecount + 1];
            if (oldTargetfiles != null)
                Array.Copy(oldTargetfiles, targetfiles, Math.Min(sourcecount + 1, oldTargetfiles.Length));
            sourcefiles[sourcecount] = sourcefile;
            progressBarCopy.Value = 10;
            if (ReplaceFrom != "")
            {
                if (likeFile == true)
                    targetfiles[sourcecount] = target + sourcefileName.Replace(ReplaceFrom, ReplaceTo).Replace(ReplaceFrom2, ReplaceTo2);
                else if (sourcefileName.ToUpper() == ReplaceFrom.ToUpper())
                    targetfiles[sourcecount] = target + sourcefileName.Replace(ReplaceFrom, ReplaceTo).Replace(ReplaceFrom2, ReplaceTo2);
                else
                    targetfiles[sourcecount] = target + sourcefileName.Replace(ReplaceFrom2, ReplaceTo2);
            }
            else
                targetfiles[sourcecount] = target + sourcefileName;

            if (FileSystem.Dir(targetfiles[sourcecount]) != "")
            {
                if (Interaction.MsgBox(targetfiles[sourcecount] + "已经存在,是否替换?", Constants.vbYesNo, "文件打包") == Constants.vbNo)
                {
                    progressBarCopy.Value = 0;
                    return;
                }
            }

            try
            {
                FileSystem.FileCopy(sourcefiles[sourcecount], targetfiles[sourcecount]);
            }
            catch (Exception ex)
            {
            }
            progressBarCopy.Value = 35;
            sourcecount = sourcecount + 1;

            if (FileSystem.Dir(Strings.Replace(sourcefile, ".SLDASM", ".SLDDRW")) != "")
            {
                oldSourcefiles = sourcefiles;
                sourcefiles = new string[sourcecount + 1];
                if (oldSourcefiles != null)
                    Array.Copy(oldSourcefiles, sourcefiles, Math.Min(sourcecount + 1, oldSourcefiles.Length));
                oldTargetfiles = targetfiles;
                targetfiles = new string[sourcecount + 1];
                if (oldTargetfiles != null)
                    Array.Copy(oldTargetfiles, targetfiles, Math.Min(sourcecount + 1, oldTargetfiles.Length));

                sourcefiles[sourcecount] = Strings.Replace(sourcefile, ".SLDASM", ".SLDDRW");
                sourcefileName = System.IO.Path.GetFileName(sourcefiles[sourcecount]);
                if (ReplaceFrom != "")
                {
                    if (likeFile == true)
                        targetfiles[sourcecount] = target + sourcefileName.Replace(ReplaceFrom, ReplaceTo).Replace(ReplaceFrom2, ReplaceTo2);
                    else if (sourcefileName.ToUpper() == ReplaceFrom.ToUpper())
                        targetfiles[sourcecount] = target + sourcefileName.Replace(ReplaceFrom, ReplaceTo).Replace(ReplaceFrom2, ReplaceTo2);
                    else
                        targetfiles[sourcecount] = target + sourcefileName.Replace(ReplaceFrom2, ReplaceTo2);
                }
                else
                    targetfiles[sourcecount] = target + sourcefileName;

                if (FileSystem.Dir(targetfiles[sourcecount]) != "")
                {
                    if (Interaction.MsgBox(targetfiles[sourcecount] + "已经存在,是否替换?", Constants.vbYesNo, "文件打包") == Constants.vbNo)
                        return;
                }

                try
                {
                    FileSystem.FileCopy(sourcefiles[sourcecount], targetfiles[sourcecount]);
                }
                catch (Exception ex)
                {
                }
                sourcecount = sourcecount + 1;
            }
            progressBarCopy.Value = 50;
            depends = (string[])swApp.GetDocumentDependencies2(sourcefile, true, true, false);

            if (depends == null)
                return;
            bool bRet;
            var idx = 1;

            while (idx <= Information.UBound(depends))
            {
                oldSourcefiles = sourcefiles;
                sourcefiles = new string[sourcecount + 1];
                if (oldSourcefiles != null)
                    Array.Copy(oldSourcefiles, sourcefiles, Math.Min(sourcecount + 1, oldSourcefiles.Length));
                oldTargetfiles = targetfiles;
                targetfiles = new string[sourcecount + 1];
                if (oldTargetfiles != null)
                    Array.Copy(oldTargetfiles, targetfiles, Math.Min(sourcecount + 1, oldTargetfiles.Length));

                sourcefiles[sourcecount] = depends[idx].ToString();
                sourcefileName = System.IO.Path.GetFileName(depends[idx].ToString());
                if (ReplaceFrom != "")
                {
                    if (likeFile == true)
                        targetfiles[sourcecount] = target + sourcefileName.Replace(ReplaceFrom, ReplaceTo).Replace(ReplaceFrom2, ReplaceTo2);
                    else if (sourcefileName.ToUpper() == ReplaceFrom.ToUpper())
                        targetfiles[sourcecount] = target + sourcefileName.Replace(ReplaceFrom, ReplaceTo).Replace(ReplaceFrom2, ReplaceTo2);
                    else
                        targetfiles[sourcecount] = target + sourcefileName.Replace(ReplaceFrom2, ReplaceTo2);
                }
                else
                    targetfiles[sourcecount] = target + sourcefileName;

                try
                {
                    FileSystem.FileCopy(sourcefiles[sourcecount], targetfiles[sourcecount]);
                }
                catch (Exception ex)
                {
                }

                idx = idx + 2;
                sourcecount = sourcecount + 1;
            }

            // swApp.SendMsgToUser("Done")
            progressBarCopy.Value = 80;
            for (int n = 0; n <= sourcecount - 1; n++)
            {
                var NewName = targetfiles[n];

                var RefQ = swApp.GetDocumentDependenciesCount(NewName, 1, 1) / (double)2;

                // Debug.Print(NewName & "--->参考文件有  " & RefQ)

                if (RefQ > 0)
                {
                    var q = 0;
                    for (q = 0; q <= sourcecount - 1; q++)
                    {
                        if (n == q)
                        {
                        }
                        else
                            bRet = swApp.ReplaceReferencedDocument(targetfiles[n], System.IO.Path.GetFileName(sourcefiles[q]), targetfiles[q]);
                    }
                }
            }

            progressBarCopy.Value = 95;
        }
  

 

posted @
2019-11-22 09:15 
painezeng  阅读(
214)  评论(
0
编辑 
收藏 
举报

C# SolidWorks 二次开发 API — 实例:自增文本标注

C# SolidWorks 二次开发 API — 实例:自增文本标注

相信大家在工程图中难免需要手动标注一些东西,而且这些东西需要按顺序变化。

如有时候需要按如下顺序标注:A1 A2 A3 A4

我们公司常用的标法还有A1 B1 A2 B2 A3 B3 这种.

而Solidworks自动的标注只能默认与上一次写的内容一致,这样总是需要手动编辑,容易出错,还效率低。

 

  1. 问题:如何快速的进行上述方式的标注.
  2. 思路:捕获Solidworks中鼠标事件,在点击图纸的时候按设定好的方式进行标注。 这里面涉及到一些事件的委托,以及工程图里面一的些API,其次就是图纸和模型的一些处理。
  3. 效果(之前做好的): ~

 

   关键代码:

   这是之前做好的,所以没有做什么注释,有空会补上。

   代码下载:https://gitee.com/painezeng/CSharpAndSolidWorks

using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CSharpAndSolidWorks
{
    public class mouseClass
    {
        private FrmNote _frmNote;

        public mouseClass(FrmNote frmNote)
        {
            _frmNote = frmNote;
        }

        public int ms_MouseSelectNotify(int ix, int iy, double X, double Y, double Z)
        {
            try
            {
                Debug.Print("Mouse loc ix = " + ix + " iy = " + iy + " x= " + X);

                SldWorks swApp;
                swApp = Comm.ConnectToSolidWorks();

                bool boolstatus;
                long longstatus;

                ModelDoc2 swModel;
                swModel = swApp.ActiveDoc;

                Note myNote;
                Annotation myAnnotation;

                myNote = swModel.InsertNote(_frmNote.activeNote);
                if (myNote != null)
                {
                    myNote.Angle = 0;
                    boolstatus = myNote.SetBalloon(0, 0);
                    myAnnotation = myNote.GetAnnotation();
                    if (myAnnotation != null)
                    {
                        longstatus = myAnnotation.SetLeader3((int)swLeaderStyle_e.swSTRAIGHT, 0, true, false, false, false);

                        boolstatus = myAnnotation.SetPosition(X + FrmNote.x / 1000, Y + FrmNote.y / 1000, Z);

                        TextFormat txtFormat = default(TextFormat);

                        txtFormat = myAnnotation.GetTextFormat(0);

                        txtFormat.Bold = true;
                        txtFormat.CharHeight = 0.01;

                        boolstatus = myAnnotation.SetTextFormat(0, false, txtFormat);
                    }
                }

                swModel.ClearSelection2(true);
                swModel.WindowRedraw();

                _frmNote.NextNote();

                if (FrmNote.haveNextNote == false)
                {
                    FrmNote.TheMouse.MouseSelectNotify -= ms_MouseSelectNotify;
                }
                else
                {
                    Frame swFrame = swApp.Frame();

                    swFrame.SetStatusBarText("Next Click  to insert " + _frmNote.activeNote);
                }

                return 1;
            }
            catch (Exception)
            {
                MessageBox.Show("Error!");

                return 0;
            }
        }
    }
}

 

 

posted @
2019-11-20 20:19 
painezeng  阅读(
140)  评论(
0
编辑 
收藏 
举报

C# SolidWorks 二次开发 API — 实例:创建中心点位置

C# SolidWorks 二次开发 API — 实例:创建中心点位置

在实际生产需要中,有些情况 我们需要知道某个路径上整体的中心点,如水管,电阻丝这些,可能需要从路径的中点开始进行放置,这个实例我们来看如何进行中点的计算与标记。我们默认路径都是是直线和圆弧组成,均相切(辅助中心线不包含在路径长度内)。

  1. ,问题:如何找到下面路径的中心点在哪里?进行标识,方便加工。

2,思路:

  1. 先得到指定草图中的所有“线段”,把中心线排除掉之后,遍历并统计出它们的长度,从而得到总长L。并且还要得到一整串的“线段”顺序。可以考虑 链 相关的数据结构
  2. 从起点或者终点开始,对每一段进行遍历,去找到中点所在的“线段”, 直到找到中点之后,通过“线段” 的参考进行计算。
  3. 画出中点,或者能标识中点位置的辅助线。

3,代码:这里很久前写的,没有写什么注释,并且水平也很菜,估计很多人看不太懂。

      public void CreateHeaterCenter(string heaterPathName)
        {
            ISketchPoint startPoint = null;
            ISketchPoint endPoint = null;
            List<SegmentData> list = new List<SegmentData>();
            List<SegmentData> list2 = new List<SegmentData>();
            List<SegmentData> list3 = new List<SegmentData>();
            List<SegmentData> list4 = new List<SegmentData>();
            _swApp.ActivateDoc(_swPartModel.GetTitle());
            _swPartModel.ShowNamedView2("*Front", 1);

            ISketchArc arc;
            double length;
            list2.Clear();
            list.Clear();
            _swPartModel.Extension.SelectByID2(heaterPathName, "SKETCH", 0.0, 0.0, 0.0, true, 0, null, 0);
            _swPartModel.ViewZoomToSelection();
            ISelectionMgr iSelectionManager = _swPartModel.ISelectionManager;

            IFeature feature = iSelectionManager.GetSelectedObject6(1, 0);

            ISketch sketch = feature.GetSpecificFeature2();

            Array array = sketch.GetSketchSegments();

            Array array2 = sketch.GetSketchPoints2();
            foreach (ISketchSegment segment in array)
            {
                ISketchSegment segment2 = segment;
                segment2.Select(true);
                if (!segment2.ConstructionGeometry)
                {
                    if (segment2.GetType() == 0)
                    {
                        ISketchLine line = (ISketchLine)segment2;
                        startPoint = line.IGetStartPoint2();
                        endPoint = line.IGetEndPoint2();
                    }
                    if (segment2.GetType() == 1)
                    {
                        arc = (ISketchArc)segment2;
                        startPoint = arc.IGetStartPoint2();
                        endPoint = arc.IGetEndPoint2();
                    }
                    SegmentData item = new SegmentData(segment2, startPoint, endPoint);
                    list.Add(item);
                }
                _swPartModel.ClearSelection2(true);
            }
            for (int i = 0; i < list.Count; i++)
            {
                int num9 = 0;
                list2.Add(list[0]);
                list.Remove(list[0]);
                for (int m = 0; m < list.Count; m++)
                {
                    list2[0].Segment.Select(false);
                    list[m].Segment.Select(false);
                    if ((Math.Round(list2[0].StartPoint.X, 5) == Math.Round(list[m].StartPoint.X, 5)) && (Math.Round(list2[0].StartPoint.Y, 5) == Math.Round(list[m].StartPoint.Y, 5)))
                    {
                        num9++;
                    }
                    if ((Math.Round(list2[0].EndPoint.X, 5) == Math.Round(list[m].EndPoint.X, 5)) && (Math.Round(list2[0].EndPoint.Y, 5) == Math.Round(list[m].EndPoint.Y, 5)))
                    {
                        num9++;
                    }
                    if ((Math.Round(list2[0].EndPoint.X, 5) == Math.Round(list[m].StartPoint.X, 5)) && (Math.Round(list2[0].EndPoint.Y, 5) == Math.Round(list[m].StartPoint.Y, 5)))
                    {
                        num9++;
                    }
                    if ((Math.Round(list2[0].StartPoint.X, 5) == Math.Round(list[m].EndPoint.X, 5)) && (Math.Round(list2[0].StartPoint.Y, 5) == Math.Round(list[m].EndPoint.Y, 5)))
                    {
                        num9++;
                    }
                    _swPartModel.ClearSelection2(true);
                    if (num9 == 2)
                    {
                        list.Add(list2[0]);
                        list2.Remove(list2[0]);
                        break;
                    }
                }
                if (num9 == 1)
                {
                    list2[0].Segment.Select(true);
                    break;
                }
            }
            int num = 0;
            for (int j = 0; j < list.Count; j++)
            {
                list2[num].Segment.Select(true);
                list[j].Segment.Select(false);
                if ((Math.Round(list2[num].StartPoint.X, 5) == Math.Round(list[j].StartPoint.X, 5)) && (Math.Round(list2[num].StartPoint.Y, 5) == Math.Round(list[j].StartPoint.Y, 5)))
                {
                    list2.Add(list[j]);
                    list.Remove(list[j]);
                    num++;
                    j = -1;
                }
                else if ((Math.Round(list2[num].EndPoint.X, 5) == Math.Round(list[j].EndPoint.X, 5)) && (Math.Round(list2[num].EndPoint.Y, 5) == Math.Round(list[j].EndPoint.Y, 5)))
                {
                    list2.Add(list[j]);
                    list.Remove(list[j]);
                    num++;
                    j = -1;
                }
                else if ((Math.Round(list2[num].EndPoint.X, 5) == Math.Round(list[j].StartPoint.X, 5)) && (Math.Round(list2[num].EndPoint.Y, 5) == Math.Round(list[j].StartPoint.Y, 5)))
                {
                    list2.Add(list[j]);
                    list.Remove(list[j]);
                    num++;
                    j = -1;
                }
                else if ((Math.Round(list2[num].StartPoint.X, 5) == Math.Round(list[j].EndPoint.X, 5)) && (Math.Round(list2[num].StartPoint.Y, 5) == Math.Round(list[j].EndPoint.Y, 5)))
                {
                    list2.Add(list[j]);
                    list.Remove(list[j]);
                    num++;
                    j = -1;
                }
            }
            _swPartModel.ClearSelection();
            _swPartModel.Extension.SelectByID2(heaterPathName, "SKETCH", 0.0, 0.0, 0.0, false, 0, null, 0);
            _swPartModel.EditSketch();
            foreach (ISketchPoint point3 in array2)
            {
                point3.Select(false);
                if (point3.Type == 1)
                {
                    _swPartModel.EditDelete();
                }
            }
            double num2 = 0.0;
            foreach (SegmentData data2 in list2)
            {
                data2.Segment.Select(false);
                length = data2.Segment.GetLength();
                num2 += length;
            }
            _swPartModel.ClearSelection();
            double num4 = num2 / 2.0;
            length = 0.0;
            int num5 = 0;
            double num6 = 0.0;
            for (int k = 0; k < list2.Count; k++)
            {
                list2[k].Segment.Select(false);
                length += list2[k].Segment.GetLength();
                if (num4 < length)
                {
                    num5 = k;
                    double num7 = Math.Abs((double)(length - num4));
                    num6 = (list2[num5].Segment.GetLength() - num7) / list2[num5].Segment.GetLength();
                    break;
                }
            }
            _swPartModel.ClearSelection();
            if (list2[num5].Segment.GetType() == 0)
            {
                double num13 = 0.0;
                double x = list2[num5].StartPoint.X;
                double y = list2[num5].StartPoint.Y;
                double num16 = list2[num5].EndPoint.X;
                double num17 = list2[num5].EndPoint.Y;
                if ((Math.Round(num16, 6) == Math.Round(list2[num5 - 1].StartPoint.X, 6)) && (Math.Round(num17, 6) == Math.Round(list2[num5 - 1].StartPoint.Y, 6)))
                {
                    num16 = list2[num5].StartPoint.X;
                    num17 = list2[num5].StartPoint.Y;
                    x = list2[num5].EndPoint.X;
                    y = list2[num5].EndPoint.Y;
                }
                else if ((Math.Round(num16, 6) == Math.Round(list2[num5 - 1].EndPoint.X, 6)) && (Math.Round(num17, 6) == Math.Round(list2[num5 - 1].EndPoint.Y, 6)))
                {
                    num16 = list2[num5].StartPoint.X;
                    num17 = list2[num5].StartPoint.Y;
                    x = list2[num5].EndPoint.X;
                    y = list2[num5].EndPoint.Y;
                }
                double pointX = x + ((num16 - x) * num6);
                double pointY = y + ((num17 - y) * num6);
                _swPartModel.SetAddToDB(true);
                if (_swPartModel.CreatePoint2(pointX, pointY, 0.0) != null)
                {
                    _swPartModel.SketchAddConstraints("sgFixed");
                }
                if (x == num16)
                {
                    num13 = 1.5707963267948966;
                }
                if (y == num17)
                {
                    num13 = 3.1415926535897931;
                }
                if ((x != num16) && !(y == num17))
                {
                    num13 = Math.Atan((num17 - y) / (num16 - x));
                }
                if (num13 > 3.1415926535897931)
                {
                    num13 -= 3.1415926535897931;
                }
                ISketchSegment segment3 = _swPartModel.ICreateLine2(pointX + (0.005 * Math.Cos(num13 + 1.5707963267948966)), pointY + (0.005 * Math.Sin(num13 + 1.5707963267948966)), 0.0, pointX + (0.005 * Math.Cos(num13 + 4.71238898038469)), pointY + (0.005 * Math.Sin(num13 + 4.71238898038469)), 0.0);
                _swPartModel.SketchAddConstraints("sgFIXED");
                segment3.ConstructionGeometry = true;
                _swPartModel.SetAddToDB(false);
                _swPartModel.ClearSelection2(true);
                _swPartModel.InsertSketch2(true);
            }
            if (list2[num5].Segment.GetType() == 1)
            {
                arc = (ISketchArc)list2[num5].Segment;
                startPoint = arc.IGetStartPoint2();
                endPoint = arc.IGetEndPoint2();
                ISketchPoint point4 = arc.IGetCenterPoint2();
                int rotationDir = arc.GetRotationDir();
                double num21 = 0.0;
                double num22 = 0.0;
                double num23 = list2[num5].Segment.GetLength();
                double radius = arc.GetRadius();
                double num25 = (num6 * num23) / radius;
                double num26 = startPoint.X;
                double num27 = startPoint.Y;
                double num28 = endPoint.X;
                double num29 = endPoint.Y;
                double num30 = point4.X;
                double num31 = point4.Y;
                if ((Math.Round(num28, 6) == Math.Round(list2[num5 - 1].StartPoint.X, 6)) && (Math.Round(num29, 6) == Math.Round(list2[num5 - 1].StartPoint.Y, 6)))
                {
                    num26 = endPoint.X;
                    num27 = endPoint.Y;
                    rotationDir = -1 * rotationDir;
                }
                else if ((Math.Round(num28, 6) == Math.Round(list2[num5 - 1].EndPoint.X, 6)) && (Math.Round(num29, 6) == Math.Round(list2[num5 - 1].EndPoint.Y, 6)))
                {
                    num26 = endPoint.X;
                    num27 = endPoint.Y;
                    rotationDir = -1 * rotationDir;
                }
                if ((num30 != num26) && !(num31 == num27))
                {
                    num21 = Math.Atan((num31 - num27) / (num30 - num26));
                }
                if (Math.Round(num30, 8) == Math.Round(num26, 8))
                {
                    if (Math.Round(num31, 8) > Math.Round(num27, 8))
                    {
                        num21 = 4.71238898038469;
                    }
                    else if (Math.Round(num31, 8) < Math.Round(num27, 8))
                    {
                        num21 = 1.5707963267948966;
                    }
                }
                else if (Math.Round(num31, 8) == Math.Round(num27, 8))
                {
                    if (Math.Round(num30, 8) > Math.Round(num26, 8))
                    {
                        num21 = 3.1415926535897931;
                    }
                    else if (Math.Round(num30, 8) < Math.Round(num26, 8))
                    {
                        if (rotationDir > 0)
                        {
                            num21 = 0.0;
                        }
                        else
                        {
                            num21 = 6.2831853071795862;
                        }
                    }
                }
                if ((Math.Round(num30, 8) < Math.Round(num26, 8)) && (Math.Round(num31, 8) < Math.Round(num27, 8)))
                {
                    num22 = num21 + (rotationDir * num25);
                }
                else if ((Math.Round(num30, 8) < Math.Round(num26, 8)) && (Math.Round(num31, 8) > Math.Round(num27, 8)))
                {
                    num22 = (6.2831853071795862 + num21) + (rotationDir * num25);
                }
                else if ((Math.Round(num30, 8) > Math.Round(num26, 8)) && (Math.Round(num31, 8) > Math.Round(num27, 8)))
                {
                    num22 = (3.1415926535897931 + num21) + (rotationDir * num25);
                }
                else if ((Math.Round(num30, 8) > Math.Round(num26, 8)) && (Math.Round(num31, 8) < Math.Round(num27, 8)))
                {
                    num22 = (3.1415926535897931 + num21) + (rotationDir * num25);
                }
                else if (Math.Round(num30, 8) == Math.Round(num26, 8))
                {
                    num22 = num21 + (rotationDir * num25);
                }
                else if (Math.Round(num31, 8) == Math.Round(num27, 8))
                {
                    num22 = num21 + (rotationDir * num25);
                }
                num22 = Math.Round(num22, 6);
                double num32 = num30 + (radius * Math.Cos(num22));
                double num33 = num31 + (radius * Math.Sin(num22));
                bool flag29 = true;
                if (_swPartModel.Extension.SelectByID2("", "SKETCHPOINT", num32, num33, 0.0, false, 0, null, 0))
                {
                    ISketchPoint point5 = iSelectionManager.GetSelectedObject6(0, 1);

                    if ((point5 != null) && ((Math.Round(point5.X, 6) == Math.Round(num32, 6)) && (Math.Round(point5.Y, 6) == Math.Round(num33, 6))))
                    {
                        flag29 = false;
                    }
                }
                _swPartModel.SetAddToDB(true);
                if (flag29 && (_swPartModel.CreatePoint2(num32, num33, 0.0) != null))
                {
                    _swPartModel.SketchAddConstraints("sgFIXED");
                    _swPartModel.ICreateLine2(num30, num31, 0.0, num32, num33, 0.0).ConstructionGeometry = true;
                }
                _swPartModel.SetAddToDB(false);
                _swPartModel.ClearSelection2(true);
                _swPartModel.InsertSketch2(true);
            }

            
        }
   

 运行结果如下图:

CAD中验证正确 :

源代码下载:

https://gitee.com/painezeng/CSharpAndSolidWorks

posted @
2019-11-19 13:37 
painezeng  阅读(
218)  评论(
0
编辑 
收藏 
举报

C# SolidWorks 二次开发 API — 2018版 中文 ModelDoc2 属性和IModelDocExtension属性

C# SolidWorks 二次开发 API — 2018版 中文 ModelDoc2 属性和IModelDocExtension属性

属性名称 描述
ActiveView Property (IModelDoc2) 获取只读模式下的当前活动模型视图。注意:此属性是一个get-only属性。集合未实现。
ConfigurationManager Property (IModelDoc2) 获取IConfigurationManager对象,该对象允许访问模型中的配置。
Extension Property (IModelDoc2) 获取imodeldocextension对象,该对象还允许访问模型文档。
FeatureManager Property (IModelDoc2) 获取iFeatureManager对象,该对象允许访问FeatureManager设计树。
FeatureManagerSplitterPosition Property (IModelDoc2) 拆分FeatureManager设计树,并获取或设置FeatureManager设计树面板中拆分栏的位置。
IActiveView Property (IModelDoc2) 获取只读模式下的当前活动模型视图。注意:此属性是一个get-only属性。集合未实现。
ILightSourcePropertyValues Property (IModelDoc2) 获取并设置光源属性值。
IMaterialPropertyValues Property (IModelDoc2) 获取或设置活动配置中材质的属性。
IPageSetup Property (IModelDoc2) 获取此文档的页面设置。
ISelectionManager Property (IModelDoc2) 获取此文档的IsElectionMgr对象,从而使当前选定的对象可用。
LargeAssemblyMode Property (IModelDoc2) 获取或设置此文档的大型程序集模式。
LengthUnit Property (IModelDoc2) 获取并设置imodeldoc2::getUnits、imodeldoc2::igetUnits和imodeldoc2::setUnits使用的相同长度单位值。
LightSourcePropertyValues Property (IModelDoc2) 获取并设置光源属性值。
LightSourceUserName Property (IModelDoc2) 获取或设置solidworks用户界面中显示的光源名称。
MaterialIdName Property (IModelDoc2) 获取或设置材质名称。
MaterialPropertyValues Property (IModelDoc2) 获取或设置活动配置中材质的属性。
MaterialUserName Property (IModelDoc2) 获取或设置材质名称。
ModelViewManager Property (IModelDoc2) 获取IModelViewManager对象,该对象允许访问模型视图。
PageSetup Property (IModelDoc2) 获取此文档的页面设置。
Printer Property (IModelDoc2) 获取或设置此文档的默认打印机。
SceneBkgImageFileName Property (IModelDoc2) 控制用作当前背景图片的图像文件名。
SceneName Property (IModelDoc2) 获取并设置场景的名称。
SceneUserName Property (IModelDoc2) 获取并设置场景的用户名。
SelectionManager Property (IModelDoc2) 获取此文档的IsElectionMgr对象,从而使当前选定的对象可用。注意:此属性是一个get-only属性。集合未实现。
ShowFeatureErrorDialog Property (IModelDoc2) 获取或设置是否显示功能错误对话框。
SketchManager Property (IModelDoc2) 获取允许访问草图创建例程的草图管理器。
SummaryInfo Property (IModelDoc2) 获取或设置solidworks文档的文件摘要信息。
Visible Property (IModelDoc2) 获取或设置活动文档的可见性。
ActiveCommandTab Property (IModelDocExtension) 获取并设置活动的solidworks commandmanager选项卡。
ActiveCommandTabIndex Property (IModelDocExtension) 获取并设置活动solidworks commandmanager选项卡的索引。
AnnotationViewCount Property (IModelDocExtension) 获取此零件或部件文档中的批注视图数。
AnnotationViews Property (IModelDocExtension) 获取此零件或部件文档中的批注视图。
AppPageSetup Property (IModelDocExtension) 获取此文档的SolidWorks应用程序页设置界面。
CommandTabVisible Property (IModelDocExtension) 获取并设置指定的solidworks commandmanager选项卡的可见性。
CustomPropertyBuilderTemplate Property (IModelDocExtension) 获取或设置此部件的自定义属性生成器模板。
CustomPropertyManager Property (IModelDocExtension) 获取此文档或配置的自定义属性。
DimXpertManager Property (IModelDocExtension) 获取此配置的dimxpert架构。
DisplayMode Property (IModelDocExtension) 获取并设置指定显示状态设置的显示模式。
DisplayStateSpecMaterialPropertyValues Property (IModelDocExtension) 获取并设置指定显示状态设置的外观设置。
Document Property (IModelDocExtension) 获取模型文档。
FeatureManagerFilterString Property (IModelDocExtension) 获取或设置FeatureManager设计树筛选器中的字符串。
FlyoutFeatureTreeVisibility Property (IModelDocExtension) 获取或设置弹出型功能管理器设计树的状态。
IncludeMassPropertiesOfHiddenBodies Property (IModelDocExtension) 获取或设置是否在程序集中包含隐藏组件的质量属性。
LinkedDisplayState Property (IModelDocExtension) 获取或设置是否在此部分中链接显示状态。
NeedsRebuild2 Property (IModelDocExtension) 获取是否需要重新生成模型文档。
ShowPartRebuildIndicators Property (IModelDocExtension) 获取或设置是否在具有过期冻结功能的部件上显示重建指示器。
SunLightInformation Property (IModelDocExtension) 获取指定的阳光信息。
ToolboxPartType Property (IModelDocExtension) 获取并设置此部分是否为SolidWorks工具箱部分。
Transparency Property (IModelDocExtension) 获取并设置指定显示状态设置的透明度状态。
UsePageSetup Property (IModelDocExtension) 获取或设置此文档是使用其自己的页面设置值、SolidWorks应用程序页面设置值,还是在单个图纸上使用设置值。
ViewDisplayRealView Property (IModelDocExtension) 获取或设置RealView图形设置。
Visibility Property (IModelDocExtension) 获取并设置指定显示状态设置的可见性状态。

posted @
2019-11-15 12:48 
painezeng  阅读(
143)  评论(
0
编辑 
收藏 
举报