美文网首页
六.装配体和多实体格式的转换

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

作者: dududuwei | 来源:发表于2019-11-27 22:21 被阅读0次

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

    SolidWorks插件-将SolidWorks文件转换为gltf格式

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

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

    相关文章

      网友评论

          本文标题:六.装配体和多实体格式的转换

          本文链接:https://www.haomeiwen.com/subject/hvgmwctx.html