C# SolidWorks 二次开发 API—零件组合之后保留颜色
solidworks默认在一个零件中把另一个零件组合进来,颜色会丢失。
组合前:
组合后:
这个例子只是简单引导一下,也是一个实际需求延申出来的。因为有时候发给客户是一个整体,并且有些颜色是有特殊意义的。
所以我们需要保留:
到这里大家可以考虑一下,有什么解决方案???
=分割线===================
方案一: 不组合,直接利用把装配另存为零件/x_t,这样能保证颜色的存在,而且发出去的是一个零件。 这样特征会丢失,同时也不方便更新后操作。
方案二: 写代码,在每次生成组合(Join)特征之后 ,把特征的颜色修改掉,改为零件的颜色。 这样保证了参数的保留,也解决了颜色 的问题。
简单方案的代码如下:
/// <summary>
/// 组合零件后保留零件颜色
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnJoinKeepBodyColor_Click(object sender, EventArgs e)
{
//请先打开45_JoinTest.sldasm
JoinPart(@"clamp1-1@45_JoinTest", @"JoinPart2-1@45_JoinTest");
}
/// <summary>
/// 组合零件
/// </summary>
/// <param name="BasePartSelectID">基础零件</param>
/// <param name="JoinPartSelectId">要组合进来的零件</param>
private bool JoinPart(string BasePartSelectID, string JoinPartSelectId)
{
SldWorks swApp = PStandAlone.GetSolidWorks();
ModelDoc2 swModel = (ModelDoc2)swApp.ActiveDoc;
AssemblyDoc assemblyDoc = (AssemblyDoc)swModel;
var boolstatus = swModel.Extension.SelectByID2(BasePartSelectID, "COMPONENT", 0, 0, 0, false, 0, null, 0);
assemblyDoc.EditPart();
var resSel = swModel.Extension.SelectByID2(JoinPartSelectId, "COMPONENT", 0, 0, 0, false, 0, null, 0);
if (resSel == true)
{
var resJoin = assemblyDoc.InsertJoin2(true, false);
if (resJoin == true)
{
swModel.SelectedFeatureProperties(0, 0, 0, 0, 0, 0, 0, true, false, "JoinColor");
assemblyDoc.EditAssembly();
swModel.ClearSelection();
boolstatus = swModel.Extension.SelectByID2(BasePartSelectID, "COMPONENT", 0, 0, 0, false, 0, null, 0);
assemblyDoc.OpenCompFile();
var swPart = (PartDoc)swApp.ActiveDoc;
var thisFeatureClip = (Feature)swPart.FeatureByName("JoinColor");
if (thisFeatureClip != null)
{
var vFaceProp = (double[])swPart.MaterialPropertyValues;
var vProps = (double[])thisFeatureClip.GetMaterialPropertyValues2(1, null);
//这里指定为红色,正常是要从被组合的零件中获取的。
vProps[0] = 1;
vProps[1] = 0;
vProps[2] = 0;
vProps[3] = vFaceProp[3];
vProps[4] = vFaceProp[4];
vProps[5] = vFaceProp[5];
vProps[6] = vFaceProp[6];
vProps[7] = vFaceProp[7];
vProps[8] = vFaceProp[8];
thisFeatureClip.SetMaterialPropertyValues2(vProps, 1, null);
vProps = null;
vFaceProp = null;
swPart.EditRebuild();
}
}
else
{
MessageBox.Show("Error to Insert Join!");
}
}
return true;
}
结果如下图:
posted @
2023-01-17 21:15
painezeng 阅读(
0) 评论(
0)
编辑
收藏
举报
来源