Exemplo n.º 1
0
        public DuplicateModelControl(ModelFootprint footprint)
        {
            InitializeComponent();

            this.btnDuplicatesMinus.Image = SVGParser.GetBitmapFromSVG(Resources.SVGImages.minus_black, new Size(24, 24));
            this.btnDuplicatesPlus.Image  = SVGParser.GetBitmapFromSVG(Resources.SVGImages.plus_black, new Size(24, 24));

            ModelFootprint = footprint;
            MaxClones      = footprint.CloneCount;
            string modelName = Path.GetFileNameWithoutExtension(footprint.Model.FileName);

            var font = FontManager.Montserrat14Regular;

            this.txtDuplicatesCount.Font = font;
            this.lblModelName.Font       = font;

            var textSize = TextRenderer.MeasureText("1", font);

            this.txtDuplicatesCount.Top += (this.txtDuplicatesCount.Height - textSize.Height) / 2;

            lblModelName.Text = modelName;

            if (footprint.Model.LinkedClones.Count > 0)
            {
                this.txtDuplicatesCount.Text = (footprint.Model.LinkedClones.Count).ToString();
            }
            else
            {
                this.txtDuplicatesCount.Text = (footprint.Model.LinkedClones.Count + 1).ToString();
            }

            TotalAmount    = int.Parse(this.txtDuplicatesCount.Text);
            this.BackColor = BackgroundColor;
            this.plDuplicateModelControl.BackColor = BackgroundColor;
        }
        private int CalcMaxClonesOfModel(ModelFootprint modelFootprint, bool minModelCount)
        {
            var tmpPackModelsRequest = PackingHelper.CreatePackModelsRequest(null);

            foreach (var duplicateControl in this.spcModelControls.Panel1.Controls.OfType <DuplicateModelControl>())
            {
                if (duplicateControl.ModelFootprint.Model != modelFootprint.Model)
                {
                    tmpPackModelsRequest.ModelFootprints.First(s => s.Model == duplicateControl.ModelFootprint.Model).RequestedCloneCount = duplicateControl.TotalAmount;
                }
                else if (minModelCount)
                {
                    tmpPackModelsRequest.ModelFootprints.First(s => s.Model == duplicateControl.ModelFootprint.Model).RequestedCloneCount = duplicateControl.TotalAmount;
                }
            }

            var solutions = PackingHelper.CalculatePackingSolutions(tmpPackModelsRequest);

            if (solutions.BestSolution != null)
            {
                return(solutions.BestSolution.PackedItems.Count(s => s.ModelFootprint.Model == modelFootprint.Model));
            }
            else
            {
                return(-1); //invalid or unable to calc more models
            }
        }
        private void UpdateDuplicates(int previousAmount, int amount, ModelFootprint modelFootprint)
        {
            //ModelFootprint modelFootprint = this.Tag as ModelFootprint;
            if (modelFootprint != null)
            {
                var tmpPackModelsRequest = PackingHelper.CreatePackModelsRequest(null);
                foreach (var duplicateControl in this.spcModelControls.Panel1.Controls.OfType <DuplicateModelControl>())
                {
                    if (duplicateControl.ModelFootprint.Model != modelFootprint.Model)
                    {
                        tmpPackModelsRequest.ModelFootprints.First(s => s.Model == duplicateControl.ModelFootprint.Model).RequestedCloneCount = duplicateControl.TotalAmount;
                    }
                    else
                    {
                        tmpPackModelsRequest.ModelFootprints.First(s => s.Model == duplicateControl.ModelFootprint.Model).RequestedCloneCount = amount;
                    }
                }

                var solutions             = PackingHelper.CalculatePackingSolutions(tmpPackModelsRequest);
                var amountOfPackagedItems = solutions.BestSolution.PackedItems.Count(s => s.ModelFootprint.Model == modelFootprint.Model);
                if (amountOfPackagedItems < amount)
                {
                    //workaround to fix bug somewhere in packaging logic
                    tmpPackModelsRequest = PackingHelper.CreatePackModelsRequest(null);
                    foreach (var duplicateControl in this.spcModelControls.Panel1.Controls.OfType <DuplicateModelControl>())
                    {
                        if (duplicateControl.ModelFootprint.Model != modelFootprint.Model)
                        {
                            tmpPackModelsRequest.ModelFootprints.First(s => s.Model == duplicateControl.ModelFootprint.Model).RequestedCloneCount = duplicateControl.TotalAmount;
                        }
                    }
                    tmpPackModelsRequest = PackingHelper.CreatePackModelsRequest(null);
                    foreach (var duplicateControl in this.spcModelControls.Panel1.Controls.OfType <DuplicateModelControl>())
                    {
                        if (duplicateControl.ModelFootprint.Model != modelFootprint.Model)
                        {
                            tmpPackModelsRequest.ModelFootprints.First(s => s.Model == duplicateControl.ModelFootprint.Model).RequestedCloneCount = duplicateControl.TotalAmount;
                        }
                    }

                    solutions = PackingHelper.CalculatePackingSolutions(tmpPackModelsRequest);
                }

                Dictionary <ModelFootprint, int> modelFootprints = new Dictionary <ModelFootprint, int>();
                modelFootprints.Add(modelFootprint, previousAmount);

                var cloneModelsEventArgs = new CloneModelsEventArgs()
                {
                    PackModelsRequest  = tmpPackModelsRequest,
                    PackagingSolutions = solutions,
                    ModelFootprints    = modelFootprints
                };

                this.ValueChanged?.Invoke(null, cloneModelsEventArgs);
            }
        }
        internal void RefreshCurrentDuplicates()
        {
            if (ObjectView.Objects3D.Count > 1)
            {
                _packModelsRequest = PackingHelper.CreatePackModelsRequest(null);
                var solutions = PackingHelper.CalculatePackingSolutions(_packModelsRequest);
                this.spcModelControls.Panel1.Controls.Clear();
                int i             = 0;
                var summaryHeight = 0;
                this.Height = 215;
                foreach (var model in ObjectView.Objects3D)
                {
                    if (model != null && (!(model is GroundPane)))
                    {
                        var stlModel = model as STLModel3D;

                        ModelFootprint modelFootprint = null;
                        if (solutions.BestSolution == null)
                        {
                            modelFootprint       = new ModelFootprint(stlModel.RightPoint - stlModel.LeftPoint, stlModel.FrontPoint - stlModel.BackPoint);
                            modelFootprint.Model = stlModel;
                        }
                        else
                        {
                            modelFootprint = solutions.BestSolution.Footprints.First(f => f.Model == stlModel);
                        }

                        if (i > 0)
                        {
                            this.Height += defaultItemHeight;
                        }

                        DuplicateModelControl duplicateModelControl = new DuplicateModelControl(modelFootprint);
                        if (i % 2 != 0)
                        {
                            duplicateModelControl.BackgroundColor = Color.FromArgb(237, 237, 237);
                        }
                        else
                        {
                            duplicateModelControl.BackgroundColor = Color.FromArgb(224, 224, 224);
                        }

                        duplicateModelControl.Left = 0;
                        duplicateModelControl.Top  = summaryHeight;
                        duplicateModelControl.DuplicatesCount_KeyUp += DuplicateModelControl_DuplicatesCount_KeyPress;
                        duplicateModelControl.DuplicatesMinus_Click += DuplicateModelControl_DuplicatesMinus_Click;
                        duplicateModelControl.DuplicatesPlus_Click  += DuplicateModelControl_DuplicatesPlus_Click;
                        this.spcModelControls.Panel1.Controls.Add(duplicateModelControl);
                        summaryHeight += defaultItemHeight;
                        i++;
                    }
                }
            }
            else
            {
                this.Visible = false;

                //show message
                var tt = new SceneControlManualToolTip();
                tt.SetText("No models available");

                var modelActionsToolbar    = SceneControlToolbarManager.ModelActionsToolbar;
                var btnDuplicationButton   = modelActionsToolbar.ModelDuplicateButton;
                var duplicationButtonPoint = new Point(btnDuplicationButton.Left + btnDuplicationButton.Width + modelActionsToolbar.Left + 16, btnDuplicationButton.Top + modelActionsToolbar.Top);
                duplicationButtonPoint.Y += (btnDuplicationButton.Height / 2) - (tt.Height / 2);
                tt.ShowToolTip(duplicationButtonPoint);

                ToolbarActionsManager.Update(Core.Enums.MainFormToolStripActionType.btnSelectPressed, frmStudioMain.SceneControl, null);
            }
        }