ChronoEngineAddin.EditChBody.UpdateFromSelection C# (CSharp) Method

UpdateFromSelection() public method

public UpdateFromSelection ( SelectionMgr swSelMgr, AttributeDef &mdefattr_chbody ) : void
swSelMgr SelectionMgr
mdefattr_chbody AttributeDef
return void
        public void UpdateFromSelection(SelectionMgr swSelMgr, ref AttributeDef mdefattr_chbody)
        {
            // Fetch current properties from the selected part(s) (i.e. ChBody in C::E)
            for (int isel = 1; isel <= swSelMgr.GetSelectedObjectCount2(-1); isel++)
                if ((swSelectType_e)swSelMgr.GetSelectedObjectType3(isel, -1) == swSelectType_e.swSelCOMPONENTS)
                {
                    //Component2 swPart = (Component2)swSelMgr.GetSelectedObject6(isel, -1);
                    Component2 swPart = swSelMgr.GetSelectedObjectsComponent3(isel, -1);
                    ModelDoc2 swPartModel = (ModelDoc2)swPart.GetModelDoc2();
                     Component2 swPartcorr = swPartModel.Extension.GetCorresponding(swPart);// ***TODO*** for instanced parts? does not work...
                     swPartcorr = swPart; // ***TODO***

                    if (swPartModel.GetType() == (int)swDocumentTypes_e.swDocASSEMBLY)
                    {
                        if (swPart.Solving == (int)swComponentSolvingOption_e.swComponentFlexibleSolving)
                        {
                            System.Windows.Forms.MessageBox.Show("Fexible assemblies not supported as ChBody (set as Rigid?)");
                            return;
                        }
                        if (swPart.Solving == (int)swComponentSolvingOption_e.swComponentRigidSolving)
                        {
                            System.Windows.Forms.MessageBox.Show("Setting props to rigid assembly as ChBody");
                            AssemblyDoc swAssemblyDoc = (AssemblyDoc)swPartModel;
                            swPart.Select(false);
                            swAssemblyDoc.EditAssembly();
                            swAssemblyDoc.EditRebuild();
                            //return;
                        }
                    }

                    // fetch SW attribute with Chrono parameters for ChBody
                    SolidWorks.Interop.sldworks.Attribute myattr = null;
                    if (swPartcorr != null)
                        myattr = (SolidWorks.Interop.sldworks.Attribute)swPart.FindAttribute(mdefattr_chbody, 0);
                    if (myattr == null)
                    {
                        // if not already added to part, create and attach it
                        //System.Windows.Forms.MessageBox.Show("Create data");
                        myattr = mdefattr_chbody.CreateInstance5(swPartModel, swPartcorr, "Chrono::ChBody_data", 0, (int)swInConfigurationOpts_e.swAllConfiguration);

                        swPartModel.ForceRebuild3(false); // needed, but does not work...
                        //swPartModel.Rebuild((int)swRebuildOptions_e.swRebuildAll); // needed but does not work...

                        if (myattr.GetEntityState((int)swAssociatedEntityStates_e.swIsEntityInvalid))
                            System.Windows.Forms.MessageBox.Show("swIsEntityInvalid!");
                        if (myattr.GetEntityState((int)swAssociatedEntityStates_e.swIsEntitySuppressed))
                            System.Windows.Forms.MessageBox.Show("swIsEntitySuppressed!");
                        if (myattr.GetEntityState((int)swAssociatedEntityStates_e.swIsEntityAmbiguous))
                            System.Windows.Forms.MessageBox.Show("swIsEntityAmbiguous!");
                        if (myattr.GetEntityState((int)swAssociatedEntityStates_e.swIsEntityDeleted))
                            System.Windows.Forms.MessageBox.Show("swIsEntityDeleted!");
                    }

                    Set_collision_on(Convert.ToBoolean(((Parameter)myattr.GetParameter(
                                        "collision_on")).GetDoubleValue()));
                    Set_friction(((Parameter)myattr.GetParameter(
                                        "friction")).GetDoubleValue());
                    Set_rolling_friction(((Parameter)myattr.GetParameter(
                                        "rolling_friction")).GetDoubleValue());
                    Set_spinning_friction(((Parameter)myattr.GetParameter(
                                        "spinning_friction")).GetDoubleValue());
                    Set_restitution(((Parameter)myattr.GetParameter(
                                        "restitution")).GetDoubleValue());
                    Set_collision_envelope(((Parameter)myattr.GetParameter(
                                        "collision_envelope")).GetDoubleValue());
                    Set_collision_margin(((Parameter)myattr.GetParameter(
                                        "collision_margin")).GetDoubleValue());
                    Set_collision_family((int)((Parameter)myattr.GetParameter(
                                        "collision_family")).GetDoubleValue());

                    // fetch SW attribute with Chrono parameters for ChConveyor
                    /*
                    SolidWorks.Interop.sldworks.Attribute myattr_conv = (SolidWorks.Interop.sldworks.Attribute)swPart.FindAttribute(defattr_chconveyor, 0);
                    if (myattr_conv == null)
                    {
                        // if not already added to part, create and attach it
                        //myattr_conv = defattr_chconveyor.CreateInstance5(swPartModel, swPart, "Chrono::ChConveyor_data", 0, (int)swInConfigurationOpts_e.swThisConfiguration);
                    }
                    */
                    /*
                    // fetch SW attribute with Chrono parameters for ChConveyor (if any!)
                    SolidWorks.Interop.sldworks.Attribute myattr_conveyor = (SolidWorks.Interop.sldworks.Attribute)swPart.FindAttribute(defattr_chconveyor, 0);
                    if (myattr_conveyor != null)
                    {
                        show_conveyor_params = true;

                        Set_conveyor_speed(((Parameter)myattr_conveyor.GetParameter(
                                        "conveyor_speed")).GetDoubleValue());
                    }
                    */
                }
        }

Usage Example

        private void button_chrono_property_Click(object sender, EventArgs e)
        {
            ModelDoc2 swModel;
            swModel = (ModelDoc2)this.mSWApplication.ActiveDoc;
            if (swModel == null)
            {
                System.Windows.Forms.MessageBox.Show("Please open an assembly and select a part!");
                return;
            }

            SelectionMgr swSelMgr = (SelectionMgr)swModel.SelectionManager;

            if (swSelMgr.GetSelectedObjectCount2(-1) == 0)
            {
                System.Windows.Forms.MessageBox.Show("Please select one or more parts!");
                return;
            }
            /*
            //***TEST***
            AttributeDef defattr_test = (AttributeDef)this.mSWApplication.DefineAttribute("mytestt");
            defattr_test.AddParameter("testpar", (int)swParamType_e.swParamTypeDouble, 0.6, 0);
            defattr_test.Register();

            Component2 swPart = (Component2)swSelMgr.GetSelectedObject6(1, -1);
            ModelDoc2 swPartModel = (ModelDoc2)swPart.GetModelDoc2();
            //ModelDoc2 swModel = (ModelDoc2)this.ActiveDoc;
             System.Windows.Forms.MessageBox.Show("attach, v CreateInstance5");
             SolidWorks.Interop.sldworks.Attribute myattr = defattr_test.CreateInstance5(swModel, swPart, "test_data", 0, (int)swInConfigurationOpts_e.swAllConfiguration);
            */

             bool selected_part = false;
             for (int isel = 1; isel <= swSelMgr.GetSelectedObjectCount2(-1); isel++)
                 if ((swSelectType_e)swSelMgr.GetSelectedObjectType3(isel, -1) == swSelectType_e.swSelCOMPONENTS)
                 {
                     selected_part = true;
                 }

             if (!selected_part)
            {
                System.Windows.Forms.MessageBox.Show("Chrono properties can be edited only for parts! Select one or more parts before using it.");
                return;
            }

            // Open modal dialog
            EditChBody myCustomerDialog = new EditChBody();

            // Update dialog properties properties from the selected part(s) (i.e. ChBody in C::E)
            myCustomerDialog.UpdateFromSelection(swSelMgr, ref this.mSWintegration.defattr_chbody); //ref this.mSWintegration.defattr_chconveyor);

            // Show the modal dialog
            if (myCustomerDialog.ShowDialog() == DialogResult.OK)
            {
                // If user pressed OK, apply settings to all selected parts (i.e. ChBody in C::E):
                myCustomerDialog.StoreToSelection(swSelMgr, ref this.mSWintegration.defattr_chbody);//ref this.mSWintegration.defattr_chconveyor);
            }
        }