通过Com 通讯方法对Delmia进行操作完成以下工作
1、初始化Delmia放在环境,保证环境标准化。
2、完成对仿真中的机器人进行操作,自动创建机器人Object TCP 等所有默认配置病完成设定的Taglist 和文件路径的个方面设置,大量节约时间
操作界面如下图:
程序头引用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CATIA_APP_ITF;
using SURFACEMACHINING;
using System.Runtime.InteropServices;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.Diagnostics;
using INFITF;
using MECMOD;
using PARTITF;
using ProductStructureTypeLib;
using SPATypeLib;
using NavigatorTypeLib;
using KnowledgewareTypeLib;
using HybridShapeTypeLib;
using System.IO;
using DNBPert;
using CATMat;
using FittingTypeLib;
using DNBASY;
using System.Windows.Forms;
using PROCESSITF;
using PPR;
using NPOI.POIFS.Crypt.Dsig;
class GloalForDelmia
{
/// <summary>
/// 初始化软件环境及全局变量
/// </summary>
/// <param name="FM">当前From</param>
/// <param name="SoftTarget">Catia/Delmia</param>
/// <returns></returns>
public DataType.Dsystem InitCatEnv(Form FM)
{
DataType.Dsystem Dsvalue= new DataType.Dsystem();
INFITF.Application DSApplication;
Documents DSDocument;
ProcessDocument DSActiveDocument;
Process[] AllProcess = Process.GetProcessesByName("DELMIA");
if (AllProcess.Length>1)
{
try
{
// MessageBox.Show("当前打开超过1个Delmia,可能操控的Delmia非您需要的对象,请核实!");
// IntPtr Ptr = AllProcess[2].MainWindowHandle;
// string Pname = AllProcess[2].MainWindowTitle;
// int progid= AllProcess[2].;
// object Pobj = Marshal.GetActiveObject("Delmia.Application");
object Tobj = Marshal.GetObjectForIUnknown(ptr2);
// object Pobj0 = Marshal.GetActiveObject(progid.ToString());
// DSApplication = (INFITF.Application)Pobj;
// String tn = DSApplication.get_Caption();
}
catch (Exception)
{
throw;
}
}
try
{
DSApplication = (INFITF.Application)Marshal.GetActiveObject("Delmia.Application");
}
catch (Exception)
{
FM.WindowState = FormWindowState.Normal;
FM.StartPosition = FormStartPosition.CenterScreen;
MessageBox.Show("未检测到打开的Delmia!,请重新运行Delmia!");
Dsvalue.Revalue = -1;
return Dsvalue;
//throw;
}
DSApplication.set_Caption("正在运行瑞祥快速建模工具!");
// 获取当前活动ProductDocument
try
{
DSDocument = (Documents)DSApplication.Documents;
DSActiveDocument = (ProcessDocument)DSApplication.ActiveDocument;
}
catch (Exception)
{
MessageBox.Show("未检测到活动Product,正在为您创建,请手动辅助完成!");
Dsvalue.Revalue = -1;
return Dsvalue;
//MessageBox.Show("未检测到活动Product,已自动为您创建对象!");
}
// 添加一个新零件
Dsvalue.DSApplication = DSApplication;
Dsvalue.DSDocument = DSDocument;
Dsvalue.DSActiveDocument = DSActiveDocument;
Dsvalue.Revalue = 0;
return Dsvalue;
}
public Selection GetInitTargetProduct(Form FM, DataType.Dsystem DSystem)
{
FM.WindowState = FormWindowState.Minimized;
INFITF.Application CatApplication=DSystem.DSApplication;
ProcessDocument PPRP = DSystem.DSActiveDocument;
Selection USelect= PPRP.Selection;
USelect.Clear();
var Result = USelect.SelectElement2(DataType.InputObjectType(9), "请选择初始化对象", true);
if (Result == "Cancel")
{
return null;
}
if (USelect.Count < 1)
{
MessageBox.Show("请先选择对象后再点此命令!");
return null;
}
return USelect;
}
public Selection GetIRobotMotion(Form FM, DataType.Dsystem DSystem)
{
FM.WindowState = FormWindowState.Minimized;
INFITF.Application CatApplication = DSystem.DSApplication;
ProcessDocument PPRP = DSystem.DSActiveDocument;
Selection USelect = PPRP.Selection;
USelect.Clear();
var Result = USelect.SelectElement2(DataType.InputObjectType(9), "请选择一个机器人", true);
if (Result == "Cancel")
{
return null;
}
if (USelect.Count < 1)
{
MessageBox.Show("请先选择对象后再点此命令!");
return null;
}
return USelect;
}
class DataType
{
/// <summary>
/// 达索关键值传送器
/// </summary>
public class Dsystem
{
/// <summary>
/// 活动Application
/// </summary>
public virtual INFITF.Application DSApplication { get; set; }
public virtual ProcessDocument DSPPRProduct { get; set; }
public virtual PPRDocument DsPPRDocument { get; set; }
public virtual Resources DSResources { get; set; }
/// <summary>
/// 活动Document
/// </summary>
public virtual Documents DSDocument { get; set; }
public virtual ProcessDocument DSActiveDocument { get; set; }
/// <summary>
/// 自定义的零件
/// </summary>
public virtual Part PartID{ get; set; }
/// <summary>
/// 用户选择集
/// </summary>
public virtual Selection USelection { get; set; }
/// <summary>
/// -1 ERR;0 Normal
/// </summary>
public virtual int Revalue { get; set; }
}
/// <summary>
/// 设置CATIA 拾取对象类型
/// 0:GetAnyObject;1:GetPoint;2:Face;3:Edge;4:Pad;5:sketch;6:Shape;7:Bodies;8:Part;9:Product
/// </summary>
/// <returns>:</returns>
[return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]
static public object[] InputObjectType(int ReadType)
{
switch (ReadType)
{
case 0: //GetAnyObject
{
return new object[] { "AnyObject" };
}
case 1: //GetPoint
{
return new object[] { "Point", "Symmetry", "Translate" };
}
case 2: //Face
{
return new object[] { "Face" };
}
case 3: //Edge
{
return new object[] { "Edge" };
}
case 4: //Pad
{
return new object[] { "Pad" };
}
case 5: //sketch
{
return new object[] { "sketch" };
}
case 6: //Shape
{
return new object[] { "Shape" };
}
case 7: //Bodies
{
return new object[] { "Bodies" };
}
case 8: //Part
{
return new object[] { "Part" };
}
case 9: //Product
{
return new object[] { "Product" };
}
case 10: //RobotMotion
{
return new object[] { "RobotMotion" };
}
case 11: //Robot
{
return new object[] { "Robot" };
}
case 12: //RobotTask
{
return new object[] { "RobotTask" };
}
case 13: //Resource
{
return new object[] { "Operation" };
}
default:
return new object[] { "AnyObject" };
}
}
public class SimulationDir
{
public string MBPath { get; set; }
public string SBRPath { get; set; }
public string SBLPath { get; set; }
public string FRPath { get; set; }
public string RRPath { get; set; }
public string UBPath { get; set; }
public string STPath { get; set; }
public string SMPath { get; set; }
public string LayoutPath { get; set; }
}
}
private void InitRobot_Click(object sender, EventArgs e)
{
Pbar.Value = 0;
Pbar.Step = 10;
GloalForDelmia GFD = new GloalForDelmia();
DStype = GFD.InitCatEnv(this);
if (DStype.Revalue == -1)
{
return;
}
Selection Uselect = GFD.GetIRobotMotion(this, DStype);
Product Usp = null;
if (Uselect != null && Uselect.Count > 0)
{
try
{
String GetName = string.Empty;
Usp = (Product)Uselect.Item2(1).Value;
GetName = Usp.get_Name();
RobGenericController Rgcr = (RobGenericController)Usp.GetTechnologicalObject("RobGenericController");
RobControllerFactory CRM = (RobControllerFactory)Usp.GetTechnologicalObject("RobControllerFactory");
GetName = CRM.get_Name();
#region 机器人基本TCP Motion初始化
for (int i = 1; i <= Convert.ToInt16(RobotCtrlNum.Text); i++)
{
GenericAccuracyProfile GP;
GenericMotionProfile GMP;
GenericToolProfile GTP;
GenericObjFrameProfile GOP;
bool ExistsObject;
CRM.CreateGenericAccuracyProfile(out GP);
GP.GetName(ref GetName);
GetName = CRM.get_Name();
GP.SetAccuracyValue(i * 0.1);
GP.SetName(i * 10 + "%");
GP.SetAccuracyType(AccuracyType.ACCURACY_TYPE_SPEED);
GP.SetFlyByMode(false);
Rgcr.HasAccuracyProfile((i * 10 + "%"), out ExistsObject);
if (!ExistsObject)
{
Rgcr.AddAccuracyProfile(GP);
}
Pbar.PerformStep();
/
CRM.CreateGenericObjFrameProfile(out GOP);
GOP.SetObjectFrame(0, 0, 0, 0, 0, 0);
GOP.SetName("Object_0" + i);
Rgcr.HasObjFrameProfile(("Object_0" + i), out ExistsObject);
if (!ExistsObject)
{
Rgcr.AddObjFrameProfile(GOP);
}
Pbar.PerformStep();
/
CRM.CreateGenericMotionProfile(out GMP);
GMP.SetSpeedValue(i * 0.1);
GMP.SetName(i * 10 + "%");
GMP.SetMotionBasis(MotionBasis.MOTION_PERCENT);
Rgcr.HasMotionProfile((i * 10 + "%"), out ExistsObject);
if (!ExistsObject)
{
Rgcr.AddMotionProfile(GMP);
}
Pbar.PerformStep();
/
// NwName = i < 9 ? ("Tool_0" + i) : ("Tool_" + i);
string NwName = "Tool_0" + i;
Rgcr.HasToolProfile(NwName, out ExistsObject);
if (!ExistsObject)
{
try
{
int ToolNum = 0;
Rgcr.GetToolProfileCount(out ToolNum);
string Ctname = string.Empty;
if (ToolNum < 16)
{
CRM.CreateGenericToolProfile(out GTP);
Rgcr.AddToolProfile(GTP);
//Object[] ToolLists = new object[ToolNum];
//Rgcr.GetToolProfiles(ToolLists);
//for (int j = 1; j <= ToolNum; j++)
//{
// Ctname = ((GenericToolProfile)ToolLists[i]).get_Name();
// ((GenericToolProfile)ToolLists[i]).set_Name(NwName);
//}
//GTP.GetName(Ctname);
//GTP.SetToolMobility(true);
//GTP.set_Name(NwName);
}
}
catch (Exception)
{
throw;
}
//Object[] TooList = new object[99];
//Rgcr.GetToolProfiles(TooList);
//int TotalTool;
//Rgcr.GetToolProfileCount(out TotalTool);
//GenericToolProfile ToolProfile =(GenericToolProfile)TooList[TotalTool-1];
//NwName = ToolProfile.get_Name();
//ToolProfile.set_Name(NwName);
}
Pbar.PerformStep();
}
#endregion
#region 机器人默认值设置
//Init Current Motion Profile \accuracy \ Tool Profile \Object
bool ExistsObj;
Rgcr.HasAccuracyProfile((100 + "%"), out ExistsObj);
if (ExistsObj)
{
Rgcr.SetCurrentAccuracyProfile((100 + "%"));
}
Rgcr.HasObjFrameProfile("Object_01", out ExistsObj);
if (ExistsObj)
{
Rgcr.SetCurrentObjFrameProfile("Object_01");
}
Rgcr.HasMotionProfile((100 + "%"), out ExistsObj);
if (ExistsObj)
{
Rgcr.SetCurrentMotionProfile((100 + "%"));
}
Rgcr.HasToolProfile("Tool_01", out ExistsObj);
if (ExistsObj)
{
Rgcr.SetCurrentToolProfile("Tool_01");
}
#endregion
#region 机器日Taglist目录及RobotTask批量设置
RobotTaskFactory Rtf = (RobotTaskFactory)Usp.GetTechnologicalObject("RobotTaskFactory");
object[] RobotTaskLists = new object[99];
try
{
Rtf.GetAllRobotTasks(RobotTaskLists);
}
catch (Exception)
{
RobotTaskLists = null;
}
GetName = Rtf.get_Name();
if (GPWeld.Checked)
{
String RobotTaskName = ((Product)((Product)Usp.Parent).Parent).get_PartNumber() + "_" + RobotID.Text.ToUpper() + "_" + ModelName.Text.ToUpper() + "_GP" + "_" + ELEID.Text;
if (!CheckTaskExists(RobotTaskLists, RobotTaskName))
{
Rtf.CreateRobotTask(RobotTaskName, null);
Tag tag = NwSingleTagGroup(((Product)((Product)Usp.Parent).Parent), RobotTaskName);
AddTagToRobotTask(Rtf, RobotTaskName, tag);
}
if (GunStand.Checked)
{
RobotTaskName = ((Product)((Product)Usp.Parent).Parent).get_PartNumber() + "_" + RobotID.Text.ToUpper() + "_GUN" + "_" + ELEID.Text + "_Pick";
if (!CheckTaskExists(RobotTaskLists, RobotTaskName))
{
Rtf.CreateRobotTask(RobotTaskName, null);
Tag tag = NwSingleTagGroup(((Product)((Product)Usp.Parent).Parent), RobotTaskName);
AddTagToRobotTask(Rtf, RobotTaskName, tag);
}
RobotTaskName = ((Product)((Product)Usp.Parent).Parent).get_PartNumber() + "_" + RobotID.Text.ToUpper() + "_GUN" + "_" + ELEID.Text + "_Drop";
if (!CheckTaskExists(RobotTaskLists, RobotTaskName))
{
Rtf.CreateRobotTask(RobotTaskName, null);
Tag tag = NwSingleTagGroup(((Product)((Product)Usp.Parent).Parent), RobotTaskName);
AddTagToRobotTask(Rtf, RobotTaskName, tag);
}
}
}
Pbar.PerformStep();
if (RPWeld.Checked)
{
String RobotTaskName = ((Product)((Product)Usp.Parent).Parent).get_PartNumber() + "_" + RobotID.Text.ToUpper() + "_" + ModelName.Text.ToUpper() + "_RP" + "_" + ELEID.Text;
if (!CheckTaskExists(RobotTaskLists, RobotTaskName))
{
Rtf.CreateRobotTask(RobotTaskName, null);
Tag tag = NwSingleTagGroup(((Product)((Product)Usp.Parent).Parent), RobotTaskName);
AddTagToRobotTask(Rtf, RobotTaskName, tag);
}
}
Pbar.PerformStep();
if (Glue.Checked)
{
String RobotTaskName = ((Product)((Product)Usp.Parent).Parent).get_PartNumber() + "_" + RobotID.Text.ToUpper() + "_" + ModelName.Text.ToUpper() + "_Glue" + "_" + ELEID.Text;
if (!CheckTaskExists(RobotTaskLists, RobotTaskName))
{
Rtf.CreateRobotTask(RobotTaskName, null);
Tag tag = NwSingleTagGroup(((Product)((Product)Usp.Parent).Parent), RobotTaskName);
AddTagToRobotTask(Rtf, RobotTaskName, tag);
}
}
Pbar.PerformStep();
if (PickAndUp.Checked)
{
String RobotTaskName = ((Product)((Product)Usp.Parent).Parent).get_PartNumber() + "_" + RobotID.Text.ToUpper() + "_" + ModelName.Text.ToUpper() + "_Gripper" + "_" + ELEID.Text;
if (!CheckTaskExists(RobotTaskLists, RobotTaskName))
{
Rtf.CreateRobotTask(RobotTaskName, null);
Tag tag = NwSingleTagGroup(((Product)((Product)Usp.Parent).Parent), RobotTaskName);
AddTagToRobotTask(Rtf, RobotTaskName, tag);
}
if (GrpStand.Checked)
{
RobotTaskName = ((Product)((Product)Usp.Parent).Parent).get_PartNumber() + "_" + RobotID.Text.ToUpper() + "_Grip" + "_" + ELEID.Text + "_Pick";
if (!CheckTaskExists(RobotTaskLists, RobotTaskName))
{
Rtf.CreateRobotTask(RobotTaskName, null);
Tag tag = NwSingleTagGroup(((Product)((Product)Usp.Parent).Parent), RobotTaskName);
AddTagToRobotTask(Rtf, RobotTaskName, tag);
}
RobotTaskName = ((Product)((Product)Usp.Parent).Parent).get_PartNumber() + "_" + RobotID.Text.ToUpper() + "_Grip" + "_" + ELEID.Text + "_Drop";
if (!CheckTaskExists(RobotTaskLists, RobotTaskName))
{
Rtf.CreateRobotTask(RobotTaskName, null);
Tag tag = NwSingleTagGroup(((Product)((Product)Usp.Parent).Parent), RobotTaskName);
AddTagToRobotTask(Rtf, RobotTaskName, tag);
}
}
}
Pbar.PerformStep();
if (StudWeld.Checked)
{
String RobotTaskName = ((Product)((Product)Usp.Parent).Parent).get_PartNumber() + "_" + RobotID.Text.ToUpper() + "_" + ModelName.Text.ToUpper() + "_Stud" + "_" + ELEID.Text;
if (!CheckTaskExists(RobotTaskLists, RobotTaskName))
{
Rtf.CreateRobotTask(RobotTaskName, null);
Tag tag = NwSingleTagGroup(((Product)((Product)Usp.Parent).Parent), RobotTaskName);
AddTagToRobotTask(Rtf, RobotTaskName, tag);
}
}
Pbar.PerformStep();
#endregion
object[] RTask = new object[50];
Rtf.GetAllRobotTasks(RTask);
foreach (RobotTask item in RTask)
{
if (item != null)
{
item.set_Description("安徽瑞祥工业自动化产品,机器人轨迹,创建于:" + DateTime.Now);
}
}
//DeviceTaskFactory DTF= (DeviceTaskFactory)Usp.GetTechnologicalObject("DeviceTaskFactory");
//DeviceTask DT=null;
//DTF.CreateDeviceTask("YECCNewTask",ref DT);
Usp.Update();
}
catch (Exception)
{
//throw;
this.TopMost = true;
MessageBox.Show("您选择的不是一个运动机构!");
}
SethomePositiion(Usp);
}
Pbar.PerformStep();
Pbar.Value = 100;
this.WindowState = FormWindowState.Normal;
this.StartPosition = FormStartPosition.CenterScreen;
this.TopMost = true;
}
private bool SethomePositiion(Product product)
{
return true; // Not Support Again
try
{
BasicDevice basicDevice = (BasicDevice)product.GetTechnologicalObject("BasicDevice");
DeviceSim deviceSim = (DeviceSim)product.GetTechnologicalObject("DeviceSim");
Mechanisms mechanisms = (Mechanisms)product.GetTechnologicalObject("Mechanisms");
//Mechanism deviceSim1 = null;
//try
//{
// int cnt = mechanisms.Count;
// string str = mechanisms.Name;
// object msobj = 1;
// mechanisms.Item(ref msobj);
//}
//catch (Exception e)
//{
// throw e;
// //If there are no mechanisms (i.e. D5 devices), use the device handle instead
// string s = mechanisms.Item(1).get_Name();
//}
Array HomePosition = new object[] { };
basicDevice.GetHomePositions(out HomePosition);
bool exithome = false;
foreach (HomePosition item in HomePosition)
{
//Array DofValue0 = new object[] { };
//item.GetDOFValues(out DofValue0);
if (item.get_Name() == "home_1")
{
exithome = true;
}
}
if (!exithome)
{
Array DofValue = new object[] { 0, 0, 0, 0, -1.5707963267949054, 0 };
basicDevice.SetHomePosition("home_1", DofValue);
//deviceSim.SetDOFValues(deviceSim1, DofValue, true);
return true;
}
return false;
}
catch (Exception)
{
return false;
}
}
/// <summary>
/// 检查机器人程序是否重复
/// </summary>
/// <param name="RobotTaskList">机器人程序集</param>
/// <param name="CheckedName">检查是否存在的程序名称</param>
/// <returns></returns>
private bool CheckTaskExists(Object[] RobotTaskList, string CheckedName)
{
if (RobotTaskList == null)
{
return false;
}
foreach (RobotTask item in RobotTaskList)
{
if (item != null)
{
String taskName = item.get_Name();
if (taskName == CheckedName)
{
return true;
}
}
}
return false;
}
private bool AddTagToRobotTask(RobotTaskFactory robotTaskFactory, String RobotTaskName, Tag tag)
{
object[] RobotTaskLists = new object[99];
try
{
robotTaskFactory.GetAllRobotTasks(RobotTaskLists);
}
catch (Exception)
{
return false;
}
foreach (RobotTask item in RobotTaskLists)
{
if (item != null)
{
String taskName = item.get_Name();
if (taskName == RobotTaskName)
{
RobotTask robotTask = item;
Operation objoperation;
objoperation = null;
robotTask.CreateOperation(null, null, ref objoperation);
AnyObject ObjRM = null;
RobotMotion robotMotion = null;
objoperation.CreateRobotMotion(ObjRM, true, ref robotMotion);
//Object[] RMobj = new object[6] { 0, 0, 0, 0, -1.5707963267949054, 0 };
robotMotion.SetTagTarget(tag);
//robotMotion.GetJointTarget(RMobj);
//robotMotion.SetJointTarget(RMobj);
//robotMotion.GetCartesianTarget(RMobj);
tag.SetName("RefPoint");
robotMotion.SetTagTarget(tag);
return true;
}
}
}
return true;
}
private void ModelName_TextChanged(object sender, EventArgs e)
{
Properties.Settings.Default.ModelName = ModelName.Text;
Properties.Settings.Default.Save();
}
private void RobotID_TextChanged(object sender, EventArgs e)
{
Properties.Settings.Default.RobotID = RobotID.Text; ;
Properties.Settings.Default.Save();
}
private void ELEADD_Click(object sender, EventArgs e)
{
int CV = Convert.ToInt16(ELEID.Text);
CV += 1;
CV = CV < 1 ? 1 : CV;
String TV = CV < 10 ? (0 + CV.ToString()) : CV.ToString();
ELEID.Text = TV;
}
private void ELEREMOVE_Click(object sender, EventArgs e)
{
int CV = Convert.ToInt16(ELEID.Text);
CV -= 1;
CV = CV < 1 ? 1 : CV;
String TV = CV < 10 ? (0 + CV.ToString()) : CV.ToString();
ELEID.Text = TV;
}
private void ManuleInit_Click(object sender, EventArgs e)
{
INITCtrol();
}
private void BackForm_Click(object sender, EventArgs e)
{
Main CMain = new Main();
this.Hide();
CMain.Show();
}
private void BallToRobotList_Click(object sender, EventArgs e)
{
int CV = Convert.ToInt16(RobotID.Text);
CV += 1;
CV = CV < 1 ? 1 : CV;
String TV = CV < 10 ? (0 + CV.ToString()) : CV.ToString();
ELEID.Text = TV;
}
private void StationNumAdd_Click(object sender, EventArgs e)
{
char[] ValueStr = RobotID.Text.ToCharArray();
int CV = Convert.ToInt16(ValueStr[1].ToString());
int RV = Convert.ToInt16(ValueStr[2].ToString());
//CV += 1;
CV = CV < 9 ? CV += 1 : 9;
CV = CV < 1 ? 1 : CV;
String TV = "R" + CV.ToString() + RV;
RobotID.Text = TV;
}
private void StationNumRemove_Click(object sender, EventArgs e)
{
char[] ValueStr = RobotID.Text.ToCharArray();
int CV = Convert.ToInt16(ValueStr[1].ToString());
int RV = Convert.ToInt16(ValueStr[2].ToString());
CV -= 1;
CV = CV < 1 ? 1 : CV;
String TV = "R" + CV.ToString() + RV;
RobotID.Text = TV;
}
private void RobotAdd_Click(object sender, EventArgs e)
{
char[] ValueStr = RobotID.Text.ToCharArray();
int RV = Convert.ToInt16(ValueStr[1].ToString());
int CV = Convert.ToInt16(ValueStr[2].ToString());
//CV += 1;
CV = CV < 9 ? CV += 1 : 9;
CV = CV < 1 ? 1 : CV;
String TV = "R" + RV + CV.ToString();
RobotID.Text = TV;
}
private void RobotRemove_Click(object sender, EventArgs e)
{
char[] ValueStr = RobotID.Text.ToCharArray();
int RV = Convert.ToInt16(ValueStr[1].ToString());
int CV = Convert.ToInt16(ValueStr[2].ToString());
CV -= 1;
CV = CV < 1 ? 1 : CV;
String TV = "R" + RV + CV.ToString();
RobotID.Text = TV;
}
}