Example #1
0
        public void PartCostTest()
        {
            PartWrapper partWrapper = new PartWrapper(new Part());

            //при пустом списке себистоимости ловим ошибку
            try
            {
                partWrapper.GetPrice();
            }
            catch (ArgumentException e)
            {
                Assert.AreSame(e.Message, "Нет себистоимости для этой даты (или для более ранней даты)");
            }

            //берем себестоимость для ближайшей ранней даты
            partWrapper.Prices.Add(new CostOnDateWrapper(new CostOnDate {
                Date = DateTime.Today.AddDays(-5), Cost = 10
            }));
            partWrapper.Prices.Add(new CostOnDateWrapper(new CostOnDate {
                Date = DateTime.Today.AddDays(-7), Cost = 15
            }));
            partWrapper.Prices.Add(new CostOnDateWrapper(new CostOnDate {
                Date = DateTime.Today.AddDays(10), Cost = 20
            }));
            Assert.AreEqual(partWrapper.GetPrice(), 10);

            //берем себистоимость соответствующей даты
            partWrapper.Prices.Add(new CostOnDateWrapper(new CostOnDate {
                Date = DateTime.Today, Cost = 25
            }));
            Assert.AreEqual(partWrapper.GetPrice(), 25);
            Assert.AreEqual(partWrapper.GetPrice(DateTime.Today.AddDays(10)), 20);
        }
Example #2
0
        /// <summary>
        /// Get/create part from save
        /// </summary>
        /// <param name="factory">part factory</param>
        /// <typeparam name="TPart">part type</typeparam>
        /// <typeparam name="TSerial">part serializable object type</typeparam>
        /// <returns>existing/new part</returns>
        /// <exception cref="IOException"></exception>
        public TPart GetPart <TPart, TSerial>(ISaveDataPartFactory <TPart, TSerial> factory)
            where TPart : ISaveDataPart <TSerial>
        {
            if (_parts.ContainsKey(factory.GetId()))
            {
                return(_parts[factory.GetId()].Get <TPart>());
            }
            if (_partList.Contains(factory.GetId()) && PartWrapper.Exists(_file, factory.GetId()))
            {
                var version = _versionMap.GetVersion(factory.GetId());
                if (version != null)
                {
                    var wrapper = PartWrapper.Load(_file, factory, (double)version);
                    if (!Equals(version, factory.GetVersion()))
                    {
                        wrapper.Save();
                        _versionMap.SetVersion(factory.GetId(), factory.GetVersion());
                    }

                    _parts.Add(factory.GetId(), wrapper);
                    return(wrapper.Get <TPart>());
                }
            }

            var w = new PartWrapper((ISaveDataPart <object>)factory.Create(), _file, factory.GetId());

            w.Save();
            _partList.Add(factory.GetId());
            _versionMap.SetVersion(factory.GetId(), factory.GetVersion());
            _parts.Add(factory.GetId(), w);
            return(w.Get <TPart>());
        }
Example #3
0
        private static void DifferencialRebuild(CancellationToken ct)
        {
            foreach (var brickInfo in Bricks)
            {
                if (ChangedParts.Contains(brickInfo.PartId))
                {
                    brickInfo.Validated = false;
                }
            }

            CurrentProgress = new ProgressInfo(ChangedParts.Count, 0);

            foreach (int partID in ChangedParts)
            {
                if (ct.IsCancellationRequested)
                {
                    break;
                }

                var brickInfo = GetBrick(partID);

                PartWrapper partInfo = null;
                try
                {
                    partInfo = PartWrapper.GetPartFromDirectory(SourcePath, partID, false);
                }
                catch { }

                if (brickInfo != null && partInfo == null)
                {
                    Bricks.Remove(brickInfo);
                    continue;
                }
                else if (partInfo != null)
                {
                    if (brickInfo == null)
                    {
                        brickInfo = new BrickInfo(partInfo)
                        {
                            LastUpdate = DateTime.Now,
                            Validated  = true
                        };
                        Bricks.Add(brickInfo);
                    }
                    else
                    {
                        brickInfo.UpdateInfo(partInfo);
                        brickInfo.LastUpdate = DateTime.Now;
                        brickInfo.Validated  = true;
                    }
                }

                CurrentProgress.TotalValidated++;
            }

            ChangedParts.Clear();
        }
Example #4
0
        private void ExportSelectedPart(MeshExportOptions exportOptions, string filepath)
        {
            var partInfo    = PartWrapper.LoadPart(LDDEnvironment.Current, PartToExport.PartId, true);
            var assimpScene = MeshConverter.LddPartToAssimp(partInfo, exportOptions);

            AssimpContext.ExportFile(assimpScene, filepath,
                                     exportOptions.FileFormatID,
                                     Assimp.PostProcessSteps.FlipUVs);
            assimpScene.Clear();
        }
Example #5
0
 public PartWrapper GetPart(int partID)
 {
     if (Lif != null)
     {
         return(PartWrapper.GetPartFromLif(Lif, partID, false));
     }
     else
     {
         return(PartWrapper.GetPartFromDirectory(PrimitiveDir.FullName, partID, false));
     }
 }
Example #6
0
        /// <summary>
        /// Remove part from the save and delete all files linked to it
        /// </summary>
        /// <param name="factory">part factory</param>
        /// <typeparam name="TPart">part type</typeparam>
        /// <typeparam name="TSerial">part serializable object type</typeparam>
        /// <exception cref="IOException"></exception>
        public void Remove <TPart, TSerial>(ISaveDataPartFactory <TPart, TSerial> factory)
            where TPart : ISaveDataPart <TSerial>
        {
            var id = factory.GetId();

            _partList.Remove(id);
            _versionMap.Remove(id);
            if (_parts.ContainsKey(id))
            {
                _parts.Remove(id);
            }
            PartWrapper.Delete(_file, id);
        }
        public async Task LoadAsync(int partID)
        {
            //DetailPart = await _partService.GetPart(partID);

            var part = await _partService.GetPart(partID);

            DetailPart = new PartWrapper(part);
            // Load Resources---------------------------------------
            var result = await _partService.GetPartResources(partID);

            if (result != null)
            {
                PartResources.Clear();
                foreach (var item in result)
                {
                    PartResources.Add(item);
                }
            }

            // Load Orders------------------------------------------
            var orders = await _partService.GetPartOrders(partID);

            if (orders != null)
            {
                PartOrders.Clear();
                foreach (var order in orders)
                {
                    PartOrders.Add(order);
                }
            }

            // Load Inventory History --------------------------------
            var trans = await _partService.GetPartTransactionAsync(partID);

            if (trans != null)
            {
                PartTransactions.Clear();
                foreach (var tran in trans)
                {
                    PartTransactions.Add(tran);
                }
            }
        }
Example #8
0
        public void PartSameParametersTest()
        {
            TestData testData = new TestData();

            //список параметров различен
            PartWrapper partWrapper1 = new PartWrapper(testData.PartVeb110);
            PartWrapper partWrapper2 = new PartWrapper(testData.PartZng110);

            Assert.IsFalse(partWrapper1.HasSameParameters(partWrapper2));

            //уравниваем списки параметров
            var pl1 = new List <ParameterWrapper>(partWrapper1.Parameters);
            var pl2 = new List <ParameterWrapper>(partWrapper2.Parameters);

            pl2.ForEach(partWrapper1.Parameters.Add);
            pl1.ForEach(partWrapper2.Parameters.Add);
            //теперь списки схожи
            Assert.IsTrue(partWrapper1.HasSameParameters(partWrapper2));
        }
Example #9
0
        private Models.BrickInfo FindPartInfo(int partID)
        {
            try
            {
                var brickInfo = BrickListCache.GetBrick(partID);
                if (brickInfo != null)
                {
                    return(brickInfo);
                }

                var part = PartWrapper.LoadPart(LDDEnvironment.Current, partID, false);
                if (part != null)
                {
                    return(new BrickInfo(part));
                }
            }
            catch { }

            return(null);
        }
 public ProjectBuildEventArgs(PartWrapper result, bool successful, IEnumerable <ValidationMessage> messages)
 {
     Result     = result;
     Successful = successful;
     Messages   = messages.ToList().AsReadOnly();
 }
Example #11
0
        public static Scene LddPartToAssimp(PartWrapper part, MeshExportOptions exportOptions = null)
        {
            if (exportOptions == null)
            {
                exportOptions = new MeshExportOptions();
            }

            var scene = new Scene()
            {
                RootNode = new Node("Root")
            };

            scene.Materials.Add(new Material()
            {
                Name = "BaseMaterial"
            });

            var meshNodes = new List <Node>();


            foreach (var surface in part.Surfaces)
            {
                string nodeName = "MainSurface";
                if (surface.SurfaceID > 0)
                {
                    nodeName = $"Decoration{surface.SurfaceID}";
                }

                var createdNodes = CreateSurfaceMeshNodes(surface, scene, nodeName, exportOptions);
                meshNodes.AddRange(createdNodes);
            }

            //meshNodes.AddRange(scene.GetNodeHierarchy().Where(x => x.MeshCount > 0));

            if (exportOptions.IncludeBones && part.IsFlexible)
            {
                var armatureNode = CreateArmatureNodeHierarchy(part, scene);

                foreach (var node in meshNodes)
                {
                    armatureNode.Children.Add(node);
                }

                scene.RootNode.Children.Add(armatureNode);
            }
            else if (meshNodes.Count > 1)
            {
                var groupNode = new Node()
                {
                    Name = "Part"
                };
                foreach (var node in meshNodes)
                {
                    groupNode.Children.Add(node);
                }
                scene.RootNode.Children.Add(groupNode);
            }
            else
            {
                scene.RootNode.Children.Add(meshNodes[0]);
            }

            if (exportOptions.IncludeConnections && part.Primitive.Connectors.Any())
            {
                var connectionsNode = new Node("Connections");
                scene.RootNode.Children.Add(connectionsNode);

                foreach (var connGroup in part.Primitive.Connectors.GroupBy(x => x.Type))
                {
                    int connectionIdx = 0;
                    foreach (var conn in connGroup)
                    {
                        var connNode = new Node($"{connGroup.Key.ToString()}{connectionIdx++}_Type_{conn.SubType}")
                        {
                            Transform = conn.Transform.ToMatrix4().ToAssimp()
                        };
                        //connNode.Metadata.Add("Type", new Assimp.Metadata.Entry(Assimp.MetaDataType.String, conn.Type.ToString()));
                        connectionsNode.Children.Add(connNode);
                    }
                }
            }

            if (exportOptions.IncludeCollisions && part.Primitive.Collisions.Any())
            {
                var collisionsNode = new Node("Collisions");
                scene.RootNode.Children.Add(collisionsNode);

                var sphereMesh = ResourceHelper.GetResourceModel("Models.Sphere.obj", "obj").Meshes[0];
                var boxMesh    = ResourceHelper.GetResourceModel("Models.Cube.obj", "obj").Meshes[0];

                foreach (var collGroup in part.Primitive.Collisions.GroupBy(x => x.CollisionType))
                {
                    int collisionIdx = 0;

                    foreach (var collision in collGroup)
                    {
                        var collNode      = new Node($"{collGroup.Key.ToString()}{collisionIdx++}");
                        var meshTransform =
                            Simple3D.Matrix4d.FromScale(collision.GetSize() * 2f) * collision.Transform.ToMatrix4d();

                        if (collision.CollisionType == LDD.Primitives.Collisions.CollisionType.Box)
                        {
                            collNode.MeshIndices.Add(scene.MeshCount);
                            scene.Meshes.Add(boxMesh.Clone());
                        }
                        else
                        {
                            collNode.MeshIndices.Add(scene.MeshCount);
                            scene.Meshes.Add(sphereMesh.Clone());
                        }
                        //connNode.Metadata.Add("Type", new Assimp.Metadata.Entry(Assimp.MetaDataType.String, conn.Type.ToString()));
                        collNode.Transform = ((Simple3D.Matrix4)meshTransform).ToAssimp();
                        collisionsNode.Children.Add(collNode);
                    }
                }
            }

            //if (exportOptions.IncludeRoundEdgeData)
            //{
            //    foreach (var mat in scene.Materials)
            //    {
            //    }
            //}

            return(scene);
        }
Example #12
0
        private static Node CreateArmatureNodeHierarchy(PartWrapper part, Scene scene)
        {
            var armatureNode = new Node()
            {
                Name = "Armature"
            };

            armatureNode.Transform = Assimp.Matrix4x4.Identity;
            var       allBoneNodes = new List <Node>();
            Matrix4x4 lastMatrix   = Assimp.Matrix4x4.Identity;
            Node      lastBoneNode = null;
            var       boneMatrixes = new Dictionary <string, Matrix4x4>();
            var       primitive    = part.Primitive;

            for (int i = 0; i < primitive.FlexBones.Count; i++)
            {
                var flexBone = primitive.FlexBones[i];

                var bonePosMat  = flexBone.Transform.ToMatrix4().ToAssimp();
                var localPosMat = bonePosMat;

                if (!lastMatrix.IsIdentity)
                {
                    var inv = lastMatrix;
                    inv.Inverse();
                    localPosMat = bonePosMat * inv;
                }

                var boneNode = new Node()
                {
                    Name      = GetBoneName(flexBone),
                    Transform = localPosMat
                };

                var boneOrientation = bonePosMat;
                boneOrientation.Inverse();

                boneMatrixes.Add(boneNode.Name, boneOrientation);

                allBoneNodes.Add(boneNode);
                if (lastBoneNode == null)
                {
                    armatureNode.Children.Add(boneNode);
                }
                else
                {
                    lastBoneNode.Children.Add(boneNode);
                }

                lastBoneNode = boneNode;
                lastMatrix   = bonePosMat;
            }

            foreach (var mesh in scene.Meshes)
            {
                foreach (var b in mesh.Bones)
                {
                    b.OffsetMatrix = boneMatrixes[b.Name];
                }
            }

            return(armatureNode);
        }
 public ExtractedPart(PartWrapper part, string extractedFileName, ExtractedPackage package)
 {
     this.Part = part;
     this.ExtractedFileName = extractedFileName;
     this.package = package;
 }
Example #14
0
 /// <summary>
 /// Check if this save has the part
 /// </summary>
 /// <param name="factory">part factory</param>
 /// <typeparam name="TPart">part type</typeparam>
 /// <typeparam name="TSerial">part serializable object type</typeparam>
 /// <returns><code>true</code> - save contains the part,otherwise - <code>false</code></returns>
 public bool Contains <TPart, TSerial>(ISaveDataPartFactory <TPart, TSerial> factory)
     where TPart : ISaveDataPart <TSerial>
 {
     return(_partList.Contains(factory.GetId()) && _versionMap.GetVersion(factory.GetId()) != null &&
            PartWrapper.Exists(_file, factory.GetId()));
 }
Example #15
0
 public void UpdateInfo(PartWrapper part)
 {
     UpdateInfo(part.Primitive);
     MeshFilenames = part.Surfaces.Select(x => x.GetFileName()).ToArray();
     Decorated     = MeshFilenames.Length > 1;
 }
Example #16
0
 public BrickInfo(PartWrapper part) : this(
         part.Primitive,
         $"{part.PartID}.xml",
         part.Surfaces.Select(x => x.GetFileName()).ToArray())
 {
 }