四.获取SolidWorks中的材质信息

四.获取SolidWorks中的材质信息

SolidWorks插件-将SolidWorks文件转换为gltf格式
  • 一.SolidWorks文件转换为glTF格式
  • 二.搭建一个Taskpane的SolidWorks插件
  • 三.获取SolidWorks文件中的网格信息
  • 四.获取SolidWorks中的材质信息
  • 五.转换为glTF格式
  • 六.装配体和多实体格式的转换
  • 去Github查看代码或下载插件安装包

4.1 关于材质

其实在上一节的代码里已经有获取SolidWorks的材质信息。在SolidWorks中的零件文档有材料信息,实体(Body)有材质信息,面有材质信息。此处的材质信息包含颜色,光泽度等等。
处理这些材质信息后才能让转换出来的文档和SolidWorks中的文档看起来相似。

4.2 材质信息

  • 在SolidWorks中,IPartDoc,IFace2,IBody都具有MaterialPropertyValue的属性。这个属性会返回一个数组。
[ R, G, B, Ambient, Diffuse, Specular, Shininess, Transparency, Emission ]
  • 在这里我们使用一个SharpglTF中MaterialBulider对象来构造一个的材质对象
 public MaterialBuilder MaterialBuilder
        {
            get
            {
                
                    if (FaceMaterialValue != null)
                    {
                        _MaterialBuilder = new MaterialBuilder()
                        .WithDoubleSide(true)
                        .WithChannelParam(KnownChannels.Normal, new System.Numerics.Vector4(
                           Convert.ToSingle(FaceMaterialValue[0]),
                           Convert.ToSingle(FaceMaterialValue[1]),
                           Convert.ToSingle(FaceMaterialValue[2]),
                           1));
                    }
                
                return _MaterialBuilder;
            }
        }
4.3 存储零件,实体,面的材质和几何信息
namespace DuSwToglTF.Model
{
    using VERTEX = SharpGLTF.Geometry.VertexTypes.VertexPosition;

    public class SWglTFModel
    {
        /// 
        /// SolidWorks材料属性
        /// 
        public double[] PartMaterialValue;
        /// 
        /// Solidworks变换矩阵
        /// 
        public MathTransform SWMathTran;
        /// 
        /// 默认材料属性
        /// 
        private MaterialBuilder InitMaterial = new MaterialBuilder()
                .WithDoubleSide(true)
                .WithMetallicRoughnessShader()
                .WithChannelParam(KnownChannels.MetallicRoughness, new Vector4(1, 0, 0, 1));
        /// 
        /// 初始原点矩阵
        /// 
        public  Matrix4x4 InitPartPos = new Matrix4x4(
            1, 0, 0, 0,
            0, 1, 0, 0,
            0, 0, 1, 0,
            0, 0, 0,1
            );

        /// 
        /// 零件矩阵
        /// 
        public Matrix4x4 PartTransform
        {
            get {
                if (SWMathTran == null)
                {
                    return InitPartPos;
                }
                else
                {
                    double[] Tran = SWMathTran.ArrayData;
                    return new Matrix4x4(
                        Convert.ToSingle(Tran[0]), Convert.ToSingle(Tran[1]), Convert.ToSingle(Tran[2]), 0,
                        Convert.ToSingle(Tran[3]), Convert.ToSingle(Tran[4]), Convert.ToSingle(Tran[5]), 0,
                        Convert.ToSingle(Tran[6]), Convert.ToSingle(Tran[7]), Convert.ToSingle(Tran[8]), 0,
                        Convert.ToSingle(Tran[9]), Convert.ToSingle(Tran[10]), Convert.ToSingle(Tran[11]), 0
                        );
                }
            }
        }
     
        //[ R, G, B, Ambient, Diffuse, Specular, Shininess, Transparency, Emission ]
        /// 
        /// 材料属性
        /// 
        public MaterialBuilder MaterialBuilder
        {
            get
            {

                if (PartMaterialValue != null)
                {
                    //if (PartMaterialValue[0] == 1 && PartMaterialValue[1] == 1 && PartMaterialValue[2] == 1)
                    //{
                    //    return InitMaterial;
                    //}
                    //else
                    //{
                    _MaterialBuilder = new MaterialBuilder()
              .WithDoubleSide(true)
              .WithChannelParam(KnownChannels.BaseColor, new System.Numerics.Vector4(
                 Convert.ToSingle(PartMaterialValue[0]),
                 Convert.ToSingle(PartMaterialValue[1]),
                 Convert.ToSingle(PartMaterialValue[2]),
                 1));
                    // }
                    
                }
                if (_MaterialBuilder == null)
                {
                    _MaterialBuilder = InitMaterial;
                }
                return _MaterialBuilder;
            }
        }
        /// 
        /// 所有的实体
        /// 
        public List BodyList = new List();
        #region 私有字段
        private Matrix4x4 _PartTransform;
        private MaterialBuilder _MaterialBuilder = null;
        #endregion
    }
    /// 
    /// 实体模型属性
    /// 
    public class BodyglTFModel
    {
        /// 
        /// 初始原点矩阵
        /// 
        public Matrix4x4 InitPartPos = new Matrix4x4(
            1, 0, 0, 0,
            0, 1, 0, 0,
            0, 0, 1, 0,
            0, 0, 0, 1
            );
        public MathTransform SWMathTran;

        /// 
        /// 零件矩阵
        /// 
        public Matrix4x4 BodyTransform
        {
            get
            {
                if (SWMathTran == null)
                {
                    return InitPartPos;
                }
                else
                {
                    double[] Tran = SWMathTran.ArrayData;
                    return new Matrix4x4(
                        Convert.ToSingle(Tran[0]), Convert.ToSingle(Tran[1]), Convert.ToSingle(Tran[2]), 0,
                        Convert.ToSingle(Tran[3]), Convert.ToSingle(Tran[4]), Convert.ToSingle(Tran[5]), 0,
                        Convert.ToSingle(Tran[6]), Convert.ToSingle(Tran[7]), Convert.ToSingle(Tran[8]), 0,
                        Convert.ToSingle(Tran[9]), Convert.ToSingle(Tran[10]), Convert.ToSingle(Tran[11]), 0
                        );
                }
            }
        }

        /// 
        /// 实体材料属性
        /// 
        public double[] BodyMaterialValue;

        //[ R, G, B, Ambient, Diffuse, Specular, Shininess, Transparency, Emission ]
        public MaterialBuilder MaterialBuilder
        {
            get
            {
             
                    if (BodyMaterialValue != null)
                    {
                        _MaterialBuilder = new MaterialBuilder()
                        .WithDoubleSide(true)
                        .WithChannelParam(KnownChannels.Normal, new System.Numerics.Vector4(
                           Convert.ToSingle(BodyMaterialValue[0]),
                           Convert.ToSingle(BodyMaterialValue[1]),
                           Convert.ToSingle(BodyMaterialValue[2]),
                           1));
                    }
              
                    return _MaterialBuilder;
                

            }
        }
        /// 
        /// 实体中所有的面
        /// 
        public List FaceList = new List();

        private MaterialBuilder _MaterialBuilder = null;

    }

    public class FaceglTFModel
    {
        /// 
        /// 面材质属性
        /// 
        public double[] FaceMaterialValue;

        private MaterialBuilder _MaterialBuilder = null;
        //[ R, G, B, Ambient, Diffuse, Specular, Shininess, Transparency, Emission ]
        public MaterialBuilder MaterialBuilder
        {
            get
            {
                
                    if (FaceMaterialValue != null)
                    {
                        _MaterialBuilder = new MaterialBuilder()
                        .WithDoubleSide(true)
                        .WithChannelParam(KnownChannels.Normal, new System.Numerics.Vector4(
                           Convert.ToSingle(FaceMaterialValue[0]),
                           Convert.ToSingle(FaceMaterialValue[1]),
                           Convert.ToSingle(FaceMaterialValue[2]),
                           1));
                    }
                
                return _MaterialBuilder;
            }
        }
        /// 
        /// 面中所有的三角面
        /// 
        public List FaceTri = new List();
    }
    /// 
    /// 一个三角形面的三个顶点
    /// 
    public class FaceVertexModel
    {
        public VERTEX a;
        public VERTEX b;
        public VERTEX c;
    }
}
  • 我们用这样一个数据结构来描述一个SolidWorks零件或者转配体。在转换中将其转换为SharpglTF的一个sence对象,在输出为gltf格式。

你可能感兴趣的:(四.获取SolidWorks中的材质信息)