属性名称 | 描述 |
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) | 获取并设置指定显示状态设置的可见性状态。 |
标签:二次开发
C# SolidWorks 二次开发 API—连接solidworks
从事二次开发十几年了,一直没有时间好好整理笔记,最近开始持续更新。
Solidworks二次开发需要一些C# Vb.net C++ 等编程语言的基础知识,大多使用Visual Studio进行开发。
再一个就是Solidworks要熟悉或者精通,因为任何手工都无法实现的东西,基本上做二次开发也不能实现。
那我们从最基础的连接到solidworks开始:
1.新建一个窗体程序或者控制台应用,我们以窗体程序为例:
加上一个按钮:
2.用NuGet查找solidworks进行dll的引用。自己选择对应版本或者其它包装好的库
(至少包括SolidWorks.Interop.sldworks ,SolidWorks.Interop.swconst,其它的可以删除掉)
3.新建一个公共类
using SolidWorks.Interop.sldworks; using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Windows.Forms; namespace CSharpAndSolidWorks { public class Utility { public static ISldWorks SwApp { get; private set; } public static ISldWorks ConnectToSolidWorks() { if (SwApp != null) { return SwApp; } else { Debug.Print("connect to solidworks on " + DateTime.Now); try { SwApp = (SldWorks)Marshal.GetActiveObject("SldWorks.Application"); } catch (COMException) { try { SwApp = (SldWorks)Marshal.GetActiveObject("SldWorks.Application.23");//2015 } catch (COMException) { try { SwApp = (SldWorks)Marshal.GetActiveObject("SldWorks.Application.26");//2018 } catch (COMException) { MessageBox.Show("Could not connect to SolidWorks.", "SolidWorks", MessageBoxButtons.OK, MessageBoxIcon.Hand); SwApp = null; } } } return SwApp; } } } }
上面这个代码块是C# 连接Solidworks的代码(EXE程序), 默认是solidworks已经被用户打开了。
这种连接不打开solidworks会提示连接失败。
这样我们可以获取到当前第一个运行的solidworks对象。(exe方式永远只能获取到第一个运行的solidworks对象。dll方式是集成在对应的运行进程中的,所以可以多个同时操作)
4.给按钮增加代码:
private void BtnConnect_Click(object sender, EventArgs e) { ISldWorks swApp = Utility.ConnectToSolidWorks(); if (swApp != null) { string msg = "This message from C#. solidworks version is " + swApp.RevisionNumber(); swApp.SendMsgToUser(msg); } }
运行之后,点击按钮,会提示如下消息,表示我们用Visual Studio连接到已经打开的Solidworks成功了 。
可在此下载源码:https://gitee.com/painezeng/CSharpAndSolidWorks
—————————————–
关于连接可以参考下面这一文章:
C# SolidWorks 二次开发 API —《入门教程》完结
目前计划就按这个思路进行博客的发布,如果大家看到此有什么想法或者开发遇到什么问题,可以留言给我,大家一起探讨.
也可以加QQ群90216591 共同研究。
源代码下载:
当前入门系列已经全部完成,希望对新朋友有些帮助。
SolidWorks API API 连接Solidworks 打开和创建新零件 读取零件属性 修改零件 遍历零件特征 遍历装配体 遍历工程图视图与球标 装配新零件 导出x_t/dwg 插入库特征 选择过滤 清空草图的几何关系 选择命名的实体/面 遍历草图中的对象 给文件增加第三方属性 显示提示信息 高级选择 包围框生成(包括装配体方案) 测量与获取结果 获取质量属性 Add-in的建立 自动注册插件与更新方案 Pane创建页面(预览BOM) 给零件加上材质 给选定面增加颜色 打断连接关系 替换零件 PMP新特征 显示拖拽 MacroFeature的生成 等待用户选择后继续操作 打包文件Pack and Go 插入块 和 属性块 工程图中获取模型 给已有特征增加几何关系 实例 创建草图中心点 自增Note插入 球标位置自动优化 批量导出实体,生成新装配体。 随机上色 屏幕1:1显示实物
C# SolidWorks 二次开发 API—钣金零件信息提取
有一段时间没有发博文了,最近有人问到钣金件的相关操作,今天我们来看看钣金零件信息的读取。
Solidworks中钣金件是有一个单独的模块,里面有一些固定的文件夹结构。
最后这个文件夹中包含了展开状态时零件的信息。如长度与折弯线相关的信息都在这里面。
一般我们要找到长 宽 厚 折弯角 与距离 折弯方向 这些信息。
输出结果如下,有些小数的处理就忽略了。大家看看就行。
粗略的写了下,输入信息在这里。很多就是API帮助里面的例子,大家可以在中文翻译中查找到。
private void btnSheetmetal_Click(object sender, EventArgs e)
{
//连接到Solidworks
ISldWorks swApp = Utility.ConnectToSolidWorks();
swApp.CommandInProgress = true;
ModelDoc2 swModel = (ModelDoc2)swApp.ActiveDoc;
//钣金 变成平板模式的特征
List<Feature> flatPatternFeatures = new List<Feature>();
//Bounding Box草图
List<string> boundingSketchesName = new List<string>();
//获取当前钣金状态--这个已经过时
//swSMBendStateFlattened 2 = 弯曲变平;该模型回滚到FlattenBends功能之后,但恰好在相应的ProcessBends功能之前
//swSMBendStateFolded 3 = 折弯处已折叠;模型回滚到FlattenBends ProcessBends功能对之后
//swSMBendStateNone 0 = 不是钣金零件;没有SheetMetal功能
//swSMBendStateSharps 1 = 弯曲处处于锐利状态;零件回滚到第一个FlattenBends功能之前
var bendState = swModel.GetBendState();
if (bendState == 0)
{
swApp.SendMsgToUser("不是钣金零件!");
return;
}
// swApp.SendMsgToUser("当前状态" + bendState);
if (bendState != 2)
{
//swApp.Command((int)swCommands_e.swCommands_Flatten, "");
//设定当前钣金状态 平板 ,下面这行代码不适用现在的零件 ,只适用于很早之前的零件
//var setStatus = swModel.SetBendState((int)swSMBendState_e.swSMBendStateFlattened);
//新钣金均是通过获取零件
var swFeatureManager = swModel.FeatureManager;
var flatPatternFolder = (FlatPatternFolder)swFeatureManager.GetFlatPatternFolder();
var featArray = (object[])flatPatternFolder.GetFlatPatterns();
for (int i = featArray.GetLowerBound(0); i <= featArray.GetUpperBound(0); i++)
{
var feat = (Feature)featArray[i];
Debug.Print(" " + feat.Name);
flatPatternFeatures.Add(feat);
feat.SetSuppression2((int)swFeatureSuppressionAction_e.swUnSuppressFeature, (int)swInConfigurationOpts_e.swThisConfiguration, null);
//解压子特征
var swSubFeat = (Feature)feat.GetFirstSubFeature();
while ((swSubFeat != null))
{
Debug.Print(swSubFeat.Name.ToString());
switch (swSubFeat.GetTypeName())
{
//如果是草图
case "ProfileFeature":
var sketchSpc = (Sketch)swSubFeat.GetSpecificFeature2();
object[] vSketchSeg = sketchSpc.GetSketchSegments();
for (int j = 0; j < vSketchSeg.Length; j++)
{
SketchSegment swSketchSeg = (SketchSegment)vSketchSeg[j];
//如果直线不是折弯线,说明是边界框
if (swSketchSeg.IsBendLine() == false)
{
boundingSketchesName.Add(swSubFeat.Name);
}
else if (swSketchSeg.IsBendLine() == true)
{
Debug.Print("钣金宽度为:" + swSketchSeg.GetLength() * 1000);
}
}
break;
default:
break;
}
swSubFeat = (Feature)swSubFeat.GetNextSubFeature();
}
}
swModel.EditRebuild3();
}
//遍历所有特征
var swSelMgr = (SelectionMgr)swModel.SelectionManager;
var swFeat = (Feature)swModel.FirstFeature();
while ((swFeat != null))
{
//Debug.Print(swFeat.Name.ToString());
// Process top-level sheet metal features
switch (swFeat.GetTypeName())
{
case "SMBaseFlange":
//var swBaseFlange = (BaseFlangeFeatureData)swFeat.GetDefinition();
//Debug.Print("钣金宽度为:" + swBaseFlange.D1OffsetDistance * 1000);
break;
case "SheetMetal":
//这里可以获取默认的厚度 Debug.Print(swFeat.Name.ToString());
SheetMetalFeatureData sheetMetalFeatureData = (SheetMetalFeatureData)swFeat.GetDefinition();
Debug.Print("钣金默认厚度为:" + sheetMetalFeatureData.Thickness * 1000);
break;
case "SM3dBend":
break;
case "SMMiteredFlange":
break;
}
// process sheet metal sub-features
var swSubFeat = (Feature)swFeat.GetFirstSubFeature();
while ((swSubFeat != null))
{
// Debug.Print(swSubFeat.Name.ToString());
switch (swSubFeat.GetTypeName())
{
case "SketchBend":
GetHisBendInformation(swApp, swModel, swSubFeat);
break;
case "OneBend":
GetHisBendInformation(swApp, swModel, swSubFeat);
break;
default:
break;
// Probably not a sheet metal feature
}
swSubFeat = (Feature)swSubFeat.GetNextSubFeature();
}
swFeat = (Feature)swFeat.GetNextFeature();
}
return;
}
private void GetHisBendInformation(ISldWorks swApp, ModelDoc2 swModel, Feature swFeat)
{
MathUtility swMathUtil = default(MathUtility);
SelectionMgr swSelMgr = default(SelectionMgr);
OneBendFeatureData swOneBend = default(OneBendFeatureData);
Object[] vSketchSegs = null;
SketchSegment swSketchSeg = default(SketchSegment);
Sketch swSketch = default(Sketch);
Feature swSketchFeat = default(Feature);
SketchLine swSketchLine = default(SketchLine);
SketchPoint swSkStartPt = default(SketchPoint);
SketchPoint swSkEndPt = default(SketchPoint);
SelectData swSelData = default(SelectData);
double[] nPt = new double[3];
MathPoint swStartPt = default(MathPoint);
MathPoint swEndPt = default(MathPoint);
MathTransform swSkXform = default(MathTransform);
int[] vID = null;
int i = 0;
swMathUtil = (MathUtility)swApp.GetMathUtility();
swSelMgr = (SelectionMgr)swModel.SelectionManager;
//swFeat = (Feature)swSelMgr.GetSelectedObject6(1, -1);
//swSelData = swSelMgr.CreateSelectData();
swOneBend = (OneBendFeatureData)swFeat.GetDefinition();
/*swBaseBend 4
swEdgeFlangeBend 8
swFlat3dBend 6
swFlatBend 2
swFreeFormBend 10 = Obsolete
swHemBend 9
swLoftedBend 12
swMirrorBend 7
swMiterBend 5
swNoneBend 3
swRoundBend 1
swRuledBend 11 = Obsolete
swSharpBend 0
*/
Debug.Print("Type of bend (swBendType_e): " + swOneBend.GetType());
Debug.Print("折弯次数: " + swOneBend.GetFlatPatternSketchSegmentCount2());
Debug.Print("折弯序号: " + swOneBend.BendOrder);
Debug.Print("折弯角度: " + swOneBend.BendAngle * 57.3 + " deg");
Debug.Print("折弯圆角: " + swOneBend.BendRadius);
if (swOneBend.BendDown == true)
{
Debug.Print("向下折弯: " + "Yes");
}
else
{
Debug.Print("向下折弯: " + " No");
}
vSketchSegs = (Object[])swOneBend.FlatPatternSketchSegments2;
for (i = 0; i <= vSketchSegs.GetUpperBound(0); i++)
{
swSketchSeg = (SketchSegment)vSketchSegs[i];
swSketch = swSketchSeg.GetSketch();
swSketchLine = (SketchLine)swSketchSeg;
swSkStartPt = (SketchPoint)swSketchLine.GetStartPoint2();
swSkEndPt = (SketchPoint)swSketchLine.GetEndPoint2();
vID = (int[])swSketchSeg.GetID();
// Get sketch feature
swSketchFeat = (Feature)swSketch;
swSkXform = swSketch.ModelToSketchTransform;
swSkXform = (MathTransform)swSkXform.Inverse();
nPt[0] = swSkStartPt.X;
nPt[1] = swSkStartPt.Y;
nPt[2] = swSkStartPt.Z;
swStartPt = (MathPoint)swMathUtil.CreatePoint(nPt);
swStartPt = (MathPoint)swStartPt.MultiplyTransform(swSkXform);
double[] swStartPtArrayData;
swStartPtArrayData = (double[])swStartPt.ArrayData;
nPt[0] = swSkEndPt.X;
nPt[1] = swSkEndPt.Y;
nPt[2] = swSkEndPt.Z;
swEndPt = (MathPoint)swMathUtil.CreatePoint(nPt);
swEndPt = (MathPoint)swEndPt.MultiplyTransform(swSkXform);
double[] swEndPtArrayData;
swEndPtArrayData = (double[])swEndPt.ArrayData;
// Debug.Print("File = " + swModel.GetPathName());
Debug.Print(" Feature = " + swFeat.Name + " [" + swFeat.GetTypeName2() + "]");
Debug.Print(" Sketch = " + swSketchFeat.Name);
Debug.Print(" SegID = [" + vID[0] + ", " + vID[1] + "]");
Debug.Print(" Start with respect to sketch = (" + swSkStartPt.X * 1000.0 + ", " + swSkStartPt.Y * 1000.0 + ", " + swSkStartPt.Z * 1000.0 + ") mm");
Debug.Print(" End with respect to sketch = (" + swSkEndPt.X * 1000.0 + ", " + swSkEndPt.Y * 1000.0 + ", " + swSkEndPt.Z * 1000.0 + ") mm");
Debug.Print(" Start with respect to model = (" + swStartPtArrayData[0] * 1000.0 + ", " + swStartPtArrayData[1] * 1000.0 + ", " + swStartPtArrayData[2] * 1000.0 + ") mm");
Debug.Print(" End with respect to model = (" + swEndPtArrayData[0] * 1000.0 + ", " + swEndPtArrayData[1] * 1000.0 + ", " + swEndPtArrayData[2] * 1000.0 + ") mm");
}
}
C# SolidWorks 二次开发 API —Solidworks的多开操作与连接指定版本Solidworks
今天有网友问我关于如何用Exe操作多个Solidworks的问题,其实之前我看到过解决方案,是通过进程和id获取,而不是我们平时常用的 (SldWorks)Marshal.GetActiveObject(“SldWorks.Application.27”);
所以晚上回来查了些资料,发现了有了解决方案,我精简了一下,做了个dll.大家可以试试。
''' <summary>
''' 创建一个新的Solidworks并返回实例
''' </summary>
''' <param name="version">指定版本号,-1表示默认.</param>
''' <param name="suppressDialogs">True 则禁用solidworks弹出消息.</param>
''' <param name="requireMainWindow">True 表示运行完显示到主窗口</param>
''' <param name="startProcessTimeout">返回Null 如果SolidWorks在指定时间内没有打开。</param>
''' <param name="createWindowTimeout">返回Null 如果SolidWorks主窗口在指定时间内没有显示.</param>
''' <returns></returns>
Public Shared Function RunSolidWorks(version As Integer,
visible As Boolean,
Optional suppressDialogs As Boolean = False,
Optional requireMainWindow As Boolean = True,
Optional startProcessTimeout As Integer = 30,
Optional createWindowTimeout As Integer = 15) As SldWorks
Dim executablePath As String = CTFileSystem.GetSolidWorksExecutablePath(version)
If File.Exists(executablePath) = False Then Return Nothing
Dim info As ProcessStartInfo = New ProcessStartInfo(executablePath)
If suppressDialogs Then info.Arguments = "/r"
Dim process As Process = Process.Start(info)
Dim app As SldWorks = Nothing
Dim t As DateTime = DateTime.Now
While app Is Nothing
Threading.Thread.Sleep(1000)
If Math.Abs(DateTime.Now.Subtract(t).Seconds) > startProcessTimeout Then Return Nothing
'If it were possible to get a GUID from a process ID then we could use GetActiveObject instead of this
app = GetComObjectFromProcessId(process.Id)
End While
t = DateTime.Now
While IsRunning(isMainWindowCreated:=True) = False
Threading.Thread.Sleep(1000)
If Math.Abs(DateTime.Now.Subtract(t).Seconds) > createWindowTimeout Then Return Nothing
End While
If visible = False Then
Dim frame As Frame = app.Frame()
If frame Is Nothing Then Return app
Dim handle As IntPtr = frame.GetHWndx64()
If ShowWindow(handle, 0) Then Return app
End If
Return app
End Function
我刚刚进行了测试,用起来比较简单。我用代码新建了两个solidworks 2018窗口:
private SldWorks sldWorks2018_1 = null;
private SldWorks sldWorks2018_2 = null;
private void button1_Click(object sender, EventArgs e)
{
sldWorks2018_1 = PStandAlone.RunSolidWorks(26, true, false, false, 30, 15);
}
private void button2_Click(object sender, EventArgs e)
{
sldWorks2018_2 = PStandAlone.RunSolidWorks(26, true, false, false, 30, 15);
}
private void button3_Click(object sender, EventArgs e)
{
sldWorks2018_1.SendMsgToUser("From 2018 -1");
sldWorks2018_2.SendMsgToUser("From 2018 -2");
}