六.装配体和多实体格式的转换

六.装配体和多实体格式的转换

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;
        }

如果要作为一个完整的转换器,还有很多工作要做。

你可能感兴趣的:(六.装配体和多实体格式的转换)