六.装配体和多实体格式的转换
SolidWorks插件-将SolidWorks文件转换为gltf格式
- 一.SolidWorks文件转换为glTF格式
- 二.搭建一个Taskpane的SolidWorks插件
- 三.获取SolidWorks文件中的网格信息
- 四.获取SolidWorks中的材质信息
- 五.转换为glTF格式
- 六.装配体和多实体格式的转换
- 去Github查看代码或下载插件安装包
SolidWorks作为一个优秀的参数化软件,其格式和信息是相当复杂的。我们转换中只处理了实体(Body)的网格信息和颜色信息,材质中一些光泽度,粗糙度等都没考虑,场景,运动动画等也没考虑。
多实体中实体的隐藏等也未考虑。
同样,在装配体的转换中,目前也只是将其作为多实体来考虑,其中零部件的运动仿真信息,零部件隐藏是否隐藏,缺失等也未考虑
6.1 文档处理
- 在转换开始前,我们要辨别一下文档类型,将不能转换的文档类型提示用户。
public SWglTFModel ConvertToglTFModel(ModelDoc2 swModel,out ErrorType errors)
{
SWglTFModel model = null;
errors = ErrorType.DoNotKnow;
ProgressStatus_event(0.01, "开始读取", ErrorType.NoErros);
swDocumentTypes_e ModelType = (swDocumentTypes_e)swModel.GetType();
switch (ModelType)
{
case swDocumentTypes_e.swDocNONE:
errors = ErrorType.NoPartOrAssemblyDocument;
return null;
case swDocumentTypes_e.swDocPART:
ProgressStatus_event(0.02, "读取零件信息", ErrorType.NoErros);
model = ConvertPartToglTF(swModel);
ProgressStatus_event(0.5, "读取零件信息完成", ErrorType.NoErros);
break;
case swDocumentTypes_e.swDocASSEMBLY:
ProgressStatus_event(0.02, "读取装配体信息", ErrorType.NoErros);
model = ConvertAssemblyToglTF(swModel);
ProgressStatus_event(0.5, "读取装配体信息完成", ErrorType.NoErros);
break;
case swDocumentTypes_e.swDocDRAWING:
errors = ErrorType.NoPartOrAssemblyDocument;
return null;
case swDocumentTypes_e.swDocSDM:
errors = ErrorType.NoPartOrAssemblyDocument;
return null;
case swDocumentTypes_e.swDocLAYOUT:
errors = ErrorType.NoPartOrAssemblyDocument;
return null;
case swDocumentTypes_e.swDocIMPORTED_PART:
break;
case swDocumentTypes_e.swDocIMPORTED_ASSEMBLY:
break;
}
if (model == null)
{
errors = ErrorType.DoNotKnow;
}
return model;
}
- 定义一个枚举类型
public enum ErrorType
{
NoErros,
NoPartOrAssemblyDocument,
DoNotKnow
}
6.2 零件转换
- 将零件默认安装多实体转换(单个实体的情况居多)
private SWglTFModel ConvertPartToglTF(ModelDoc2 swModel)
{
SWglTFModel Model = new SWglTFModel();
var MaterialValue = ((PartDoc)swModel).MaterialPropertyValues;
if (MaterialValue != null)
{
Model.PartMaterialValue = MaterialValue;
}
object[] bodys = ((PartDoc)swModel).GetBodies((int)swBodyType_e.swAllBodies);
foreach (Body2 swBody in bodys)
{
Model.BodyList.Add(GetglTFBodyModel(swBody));
}
return Model;
}
6.3 装配体转换
private SWglTFModel ConvertAssemblyToglTF(ModelDoc2 swModel)
{
SWglTFModel Model = new SWglTFModel();
AssemblyDoc swAssDoc = (AssemblyDoc)swModel;
object[] comps = swAssDoc.GetComponents(false);
foreach (Component2 item in comps)
{
double[] MaterialValue = item.MaterialPropertyValues;
if (MaterialValue == null)
{
ModelDoc2 swCompModel = item.GetModelDoc2();
if (swCompModel!= null)
{
MaterialValue = swCompModel.MaterialPropertyValues;
}
}
object[] bodys = item.GetBodies2((int)swBodyType_e.swAllBodies);
if (bodys != null)
{
foreach (Body2 swBody in bodys)
{
var bodymodel = GetglTFBodyModel(swBody);
if (bodymodel.BodyMaterialValue == null && MaterialValue !=null)
{
bodymodel.BodyMaterialValue = MaterialValue;
}
bodymodel.SWMathTran = item.Transform2;
Model.BodyList.Add(bodymodel);
}
}
}
return Model;
}
如果要作为一个完整的转换器,还有很多工作要做。
网友评论