首页 > 解决方案 > 在 python 中使用引用作为函数调用 C# public voids

问题描述

我希望能够从 python 中的 C# 代码访问公共空白。c# 代码是在 Visual Studio 中制作的,需要以特定 .dll 文件的形式引用。

我尝试了 Ironpython、pynet,但似乎无法让它工作。

以下是 C# 中的代码,其中 Dlubal.RFEM5 是来自 .dll 文件的部分。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using Dlubal.RFEM5;



    namespace WindowsFormsApp4
    {
    public partial class Form1 : Form
    {


        private void Form1_Load(object sender, EventArgs e)
        {

        }

        public void CreateNewApplication()
        {
            // creates a hidden RFEM instance and gets it's interface
            IApplication app = new Dlubal.RFEM5.Application();
            // checks RF-COM license and locks the application for     using by COM
            app.LockLicense();

            //...
            // here you can write your code
            //...

            // shows RFEM window
            app.Show();

            // unlocks the application and releases RF-COM license
            app.UnlockLicense();

            // releases COM object
            app = null;
            // cleans Garbage Collector for releasing all COM interfaces and objects.
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
        }

        public void GetActiveApplication()
        {
            // gets interface to a running RFEM
            IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
            // checks RF-COM license and locks the application for     using by COM
            app.LockLicense();

            //...
            // here you can write your code
            //...

            // unlocks the application and releases RF-COM license
            app.UnlockLicense();

            // releases COM object
            app = null;
            // cleans Garbage Collector for releasing all COM interfaces and objects
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
        }

        public void CreateNewStructure()
        {
            // creates a hidden RFEM instance and gets it's interface
            IModel model = new Model();
            // checks RF-COM license and locks the application for     using by COM
            model.GetApplication().LockLicense();

            //...
            // here you can write your code
            //...

            // shows RFEM window
            model.GetApplication().Show();

            // unlocks the application and releases RF-COM license
            model.GetApplication().UnlockLicense();

            // releases COM object
            model = null;
            // cleans Garbage Collector for releasing all COM interfaces and objects.
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
        }


        public void CloseApplication()
        {
            // Gets interface to a running RFEM.
            IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
            // Checks RF-COM license and locks the application for     using by COM.
            app.LockLicense();

            //...
            // Here you can write your code.
            //...

            // Unlocks the application and releases RF-COM license.
            app.UnlockLicense();

            // Closes the application.
            app.Close();

            // Cleans garbage collector and release application from the memory.
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
        }

        public void CleanModelData()
        {
            IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
            model.GetApplication().LockLicense();
            IModelData data = model.GetModelData();

            data.PrepareModification();
            data.Clean();
            data.FinishModification();

            model.GetApplication().UnlockLicense();
        }


        public void AddPoint(float xval, float yval, float zval, int number)
        {
            // gets interface to a running RFEM
            IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
            // checks RF-COM license and locks the application for     using by COM
            app.LockLicense();


            //adding a point id 3D space
            IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
            IModelData data = model.GetModelData();
#pragma warning disable IDE0017 // Simplify object initialization
            Node newnode = new Node();
#pragma warning restore IDE0017 // Simplify object initialization
            newnode.X = xval;
            newnode.Y = yval;
            newnode.Z = zval;
            newnode.No = number;

            data.PrepareModification();
            data.SetNode(newnode);
            data.FinishModification();



            // unlocks the application and releases RF-COM license
            app.UnlockLicense();

            // releases COM object
            app = null;
            // cleans Garbage Collector for releasing all COM interfaces and objects
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
        }


        public void Addline(int numbernode1, int numbernode2)
        {
            // gets interface to a running RFEM
            IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
            // checks RF-COM license and locks the application for     using by COM
            app.LockLicense();


            //adding a line in 3D space between 2 nodes
            IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
            IModelData data = model.GetModelData();
#pragma warning disable IDE0017 // Simplify object initialization
            Line newline = new Line();
#pragma warning restore IDE0017 // Simplify object initialization
            newline.NodeList = string.Format("{0},{1}",numbernode1,numbernode2);
            newline.Type = LineType.PolylineType;


            data.PrepareModification();
            data.SetLine(newline);
            data.FinishModification();



            // unlocks the application and releases RF-COM license
            app.UnlockLicense();

            // releases COM object
            app = null;
            // cleans Garbage Collector for releasing all COM interfaces and objects
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
        }


        public void AddMaterial(string description, int number)
        {
            // gets interface to a running RFEM
            IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
            // checks RF-COM license and locks the application for     using by COM
            app.LockLicense();


            //adding a new material
            IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
            IModelData data = model.GetModelData();

#pragma warning disable IDE0017 // Simplify object initialization
            Material newmat = new Material();
#pragma warning restore IDE0017 // Simplify object initialization
            newmat.Description = description;
            newmat.No = number;





            data.PrepareModification();
            data.SetMaterial(newmat);
            data.FinishModification();



            // unlocks the application and releases RF-COM license
            app.UnlockLicense();

            // releases COM object
            app = null;
            // cleans Garbage Collector for releasing all COM interfaces and objects
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
        }






        public void CreatNewMember(int linenumber, int startcrossectionnumber, int number)
        {
            // gets interface to a running RFEM
            IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
            // checks RF-COM license and locks the application for     using by COM
            app.LockLicense();


            //adding a member (beam with crossection) in 3D space at a line
            IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
            IModelData data = model.GetModelData();
#pragma warning disable IDE0017 // Simplify object initialization
            Member newmember = new Member();
#pragma warning restore IDE0017 // Simplify object initialization

            newmember.LineNo = linenumber;
            newmember.StartCrossSectionNo = startcrossectionnumber;
            newmember.No = number;


            data.PrepareModification();
            data.SetMember(newmember);
            data.FinishModification();



            // unlocks the application and releases RF-COM license
            app.UnlockLicense();

            // releases COM object
            app = null;
            // cleans Garbage Collector for releasing all COM interfaces and objects
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
        }



        public void CreateNewCrosssection(string textid, int materialnumber, int number)
        {
            // gets interface to a running RFEM
            IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
            // checks RF-COM license and locks the application for     using by COM
            app.LockLicense();


            //adding a new crossection
            IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
            IModelData data = model.GetModelData();
#pragma warning disable IDE0017 // Simplify object initialization
            CrossSection newcross = new CrossSection();
#pragma warning restore IDE0017 // Simplify object initialization
            newcross.TextID = textid;
            newcross.MaterialNo = materialnumber;
            newcross.No = number;

            data.PrepareModification();
            data.SetCrossSection(newcross);
            data.FinishModification();



            // unlocks the application and releases RF-COM license
            app.UnlockLicense();

            // releases COM object
            app = null;
            // cleans Garbage Collector for releasing all COM interfaces and objects
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
        }




        public void CreateNewNodalSupport(int number, string nodelist, int restrainx, int restrainy, int restrainz, int restrainrotationx, int restrainrotationy, int restrainrotationz)
        {
            // gets interface to a running RFEM
            IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
            // checks RF-COM license and locks the application for     using by COM
            app.LockLicense();


            //adding a new nodalsupport
            IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
            IModelData data = model.GetModelData();
    #pragma warning disable IDE0017 // Simplify object initialization
            NodalSupport nodalSupport = new NodalSupport();
    #pragma warning restore IDE0017 // Simplify object initialization

            nodalSupport.No = number;
            nodalSupport.NodeList = nodelist;
            nodalSupport.RestraintConstantX = restrainrotationx;
            nodalSupport.RestraintConstantY = restrainrotationy;
            nodalSupport.RestraintConstantZ = restrainrotationz;
            nodalSupport.SupportConstantX = restrainx;
            nodalSupport.SupportConstantY = restrainy;
            nodalSupport.SupportConstantZ = restrainz;

            data.PrepareModification();
            data.SetNodalSupport(nodalSupport);
            data.FinishModification();



            // unlocks the application and releases RF-COM license
            app.UnlockLicense();

            // releases COM object
            app = null;
            // cleans Garbage Collector for releasing all COM interfaces and objects
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
        }



        public void CreateNewLoadCase(int number, bool SelfWeight, bool ToSolve, ActionCategoryType ActionCathogory, float SelfWeightFactorX, float SelfWeightFactorY, float SelfWeightFactorZ)
        {
            // gets interface to a running RFEM
            IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
            // checks RF-COM license and locks the application for     using by COM
            app.LockLicense();


            //adding a new loadcase
            IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
            ILoads data = model.GetLoads();
            LoadCase loadCase = new LoadCase();
            loadCase.Loading.No = number;
            loadCase.SelfWeight = SelfWeight;
            loadCase.ToSolve = ToSolve;
            loadCase.ActionCategory = ActionCathogory;
            if (SelfWeight)
            {
                loadCase.SelfWeightFactor.X = SelfWeightFactorX;
                loadCase.SelfWeightFactor.Y = SelfWeightFactorY;
                loadCase.SelfWeightFactor.Z = SelfWeightFactorZ;
            }




            data.PrepareModification();
            data.SetLoadCase(loadCase);
            data.FinishModification();



            // unlocks the application and releases RF-COM license
            app.UnlockLicense();

            // releases COM object
            app = null;
            // cleans Garbage Collector for releasing all COM interfaces and objects
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
        }


        public void CreateLoadCombo(int loadnumber, bool ToSolve, string definitionloadcombo)
        {
            // gets interface to a running RFEM
            IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
            // checks RF-COM license and locks the application for     using by COM
            app.LockLicense();


            //adding a new loadcombination
            IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
            ILoads data = model.GetLoads();

            Dlubal.RFEM5.LoadCombination loadCombination = new Dlubal.RFEM5.LoadCombination();

            loadCombination.Loading.No = loadnumber;
            loadCombination.ToSolve = ToSolve;
            loadCombination.Definition = definitionloadcombo;






            data.PrepareModification();
            data.SetLoadCombination(loadCombination);
            data.FinishModification();



            // unlocks the application and releases RF-COM license
            app.UnlockLicense();

            // releases COM object
            app = null;
            // cleans Garbage Collector for releasing all COM interfaces and objects
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
        }


        public void CreateResultCombo(int resultnumber, string resultdefinition)
        {
            // gets interface to a running RFEM
            IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
            // checks RF-COM license and locks the application for     using by COM
            app.LockLicense();


            //adding a new resultcombination
            IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
            ILoads data = model.GetLoads();

            Dlubal.RFEM5.ResultCombination resultCombination = new Dlubal.RFEM5.ResultCombination();

            resultCombination.Loading.No = resultnumber;

            resultCombination.Definition = resultdefinition;






            data.PrepareModification();
            data.SetResultCombination(resultCombination);
            data.FinishModification();



            // unlocks the application and releases RF-COM license
            app.UnlockLicense();

            // releases COM object
            app = null;
            // cleans Garbage Collector for releasing all COM interfaces and objects
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
        }


        public void Trapezoidalload(int loadnumber, string objectlist, float magnitude1, float magnitude2, bool relativedistance, float distanceA, float distanceB)
        {
            // gets interface to a running RFEM
            IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
            // checks RF-COM license and locks the application for     using by COM
            app.LockLicense();


            //adding a new trapezoidal load

            IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;

            ILoads loads = model.GetLoads();

      #pragma warning disable IDE0017 // Simplify object initialization
            MemberLoad memberLoad = new MemberLoad();
     #pragma warning restore IDE0017 // Simplify object initialization
            memberLoad.No = loadnumber;
            memberLoad.ObjectList = objectlist;
            memberLoad.Distribution = LoadDistributionType.TrapezoidalType;
            memberLoad.Magnitude1 = magnitude1;
            memberLoad.Magnitude2 = magnitude2;
            memberLoad.RelativeDistances = relativedistance;
            memberLoad.DistanceA = distanceA;
            memberLoad.DistanceB = distanceB;

            // gets load case No.1
            ILoadCase loadCase = loads.GetLoadCase(1, ItemAt.AtNo);

            // sets member load
            loadCase.PrepareModification();
            loadCase.SetMemberLoad(memberLoad);
            loadCase.FinishModification();

            // unlocks the application and releases RF-COM license
            app.UnlockLicense();

            // releases COM object
            app = null;
            // cleans Garbage Collector for releasing all COM interfaces and objects
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
        }


        public void Uniformload(int loadnumber, string objectlist, float magnitude1)
        {
            // gets interface to a running RFEM
            IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
            // checks RF-COM license and locks the application for     using by COM
            app.LockLicense();


            //adding a new uniform load
            //ILoadCase loadCase = Marshal.GetActiveObject("RFEM5.Memberload") as ILoadCase;
            IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;

            ILoads loads = model.GetLoads();

#pragma warning disable IDE0017 // Simplify object initialization
            MemberLoad memberLoad = new MemberLoad();
#pragma warning restore IDE0017 // Simplify object initialization
            memberLoad.No = loadnumber;
            memberLoad.ObjectList = objectlist;
            memberLoad.Distribution = LoadDistributionType.UniformType;
            memberLoad.Magnitude1 = magnitude1;
            // gets load case No.1
            ILoadCase loadCase = loads.GetLoadCase(1, ItemAt.AtNo);
            loadCase.PrepareModification();
            loadCase.SetMemberLoad(memberLoad);
            loadCase.FinishModification();



            // unlocks the application and releases RF-COM license
            app.UnlockLicense();

            // releases COM object
            app = null;
            // cleans Garbage Collector for releasing all COM interfaces and objects
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
        }



        public void Nodalload(int loadnumber, string nodelist, float Fx, float Fy, float Fz, float Mx, float My, float Mz)
        {
            // gets interface to a running RFEM
            IApplication app = Marshal.GetActiveObject("RFEM5.Application") as IApplication;
            // checks RF-COM license and locks the application for     using by COM
            app.LockLicense();


            //adding a new nodal load

            IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;


            ILoads loads = model.GetLoads();


#pragma warning disable IDE0017 // Simplify object initialization
            NodalLoad nodalLoad = new NodalLoad();
#pragma warning restore IDE0017 // Simplify object initialization


            nodalLoad.No = loadnumber;
            nodalLoad.NodeList = nodelist;
            nodalLoad.Component.Force.X = Fx;
            nodalLoad.Component.Force.Y = Fy;
            nodalLoad.Component.Force.Z = Fz;
            nodalLoad.Component.Moment.X = Mx;
            nodalLoad.Component.Moment.Y = My;
            nodalLoad.Component.Moment.Z = Mz;

            ILoadCase loadCase = loads.GetLoadCase(1, ItemAt.AtNo);
            loadCase.PrepareModification();
            loadCase.SetNodalLoad(nodalLoad);
            loadCase.FinishModification();



            // unlocks the application and releases RF-COM license
            app.UnlockLicense();

            // releases COM object
            app = null;
            // cleans Garbage Collector for releasing all COM interfaces and objects
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
        }

        public void SetSurface(int surfacenumber, int materialnumber, string boundarylines, float thicknessconstant)
        {
            IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
            model.GetApplication().LockLicense();
            IModelData data = model.GetModelData();

#pragma warning disable IDE0017 // Simplify object initialization
            Surface surface = new Surface();
#pragma warning restore IDE0017 // Simplify object initialization
            surface.No = surfacenumber;
            surface.MaterialNo = materialnumber;
            surface.BoundaryLineList = boundarylines;
            surface.Thickness.Constant = thicknessconstant;


            data.PrepareModification();
            data.SetSurface(surface);
            data.FinishModification();

            model.GetApplication().UnlockLicense();
        }



        public void SetSolid(int surfacenumber, int materialnumber, string surfaceslist)
        {
            IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
            model.GetApplication().LockLicense();
            IModelData data = model.GetModelData();

#pragma warning disable IDE0017 // Simplify object initialization
            Solid solid = new Solid();
#pragma warning restore IDE0017 // Simplify object initialization
            solid.No = surfacenumber;
            solid.MaterialNo = materialnumber;
            solid.SurfaceList = surfaceslist;

            data.PrepareModification();
            data.SetSolid(solid);
            data.FinishModification();

            model.GetApplication().UnlockLicense();
        }




        public void SetSurfaceUniformLoad(int surfaceloadnumber, string surfaceslist, LoadDirectionType loaddirection, int strength)
        {
            IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
            model.GetApplication().LockLicense();
            ILoads loads = model.GetLoads();

#pragma warning disable IDE0017 // Simplify object initialization
            SurfaceLoad load = new SurfaceLoad();
#pragma warning restore IDE0017 // Simplify object initialization
            load.No = surfaceloadnumber;
            load.SurfaceList = surfaceslist;
            load.Direction = loaddirection;
            load.Distribution = LoadDistributionType.UniformType;
            load.Type = LoadType.ForceType;
            load.Magnitude1 = strength;

            // gets load case No.1
            ILoadCase loadCase = loads.GetLoadCase(1, ItemAt.AtNo);

            // sets surface load
            loadCase.PrepareModification();
            loadCase.SetSurfaceLoad(load);
            loadCase.FinishModification();

            model.GetApplication().UnlockLicense();
        }






        public void Calculateresults()
        {
            IModel model = Marshal.GetActiveObject("RFEM5.Model") as IModel;
            model.GetApplication().LockLicense();
            ICalculation calculation = model.GetCalculation();

            // Calculates everything
            calculation.CalculateAll();

            model.GetApplication().UnlockLicense();
        }













    }
}

标签: c#python

解决方案


推荐阅读