今年的世界杯依旧是那样的火爆,全世界78亿双眼睛都在关注,或者说不止是体育,更多的是一种精神、文化、励志和宣传。
作为一名程序猿,熬夜写代码和熬夜看球都是必不可少的,今天特意送来来自程序猿定制版的世界杯足球制作方法,希望广大博友喜欢。
为了制作这个足球,特意学了一下UG软件,跟着网上的教程做了足球的黑块和白块作为标准件,然后根据一定的角度和方位调整自动合成足球,整个制作过程包括了标准件设计和工业软件自动化的元素。
先看主程序:
using System;
using NXOpen;
using NXOpen.UF;
using NX_WorldCup;
using System.Threading;
public class Program
{
// class members
public static Program theProgram;
public static bool isDisposeCalled;
public static Session theSession;
public static Part workPart;
public static Part displayPart;
public static NXOpen.UF.UFSession theUFSession;
private static UI theUI = null;
public static int milliseconds = 500;
public static int Main(string[] args)
{
theSession = Session.GetSession();
displayPart = theSession.Parts.Display;
theUFSession = UFSession.GetUFSession();
workPart = theSession.Parts.Work;
theUI = UI.GetUI();
int retValue = 0;
try
{
//导入已经做好的足球零件
BasePart basePart1;
PartLoadStatus partLoadStatus1;
basePart1 = theSession.Parts.OpenBaseDisplay("C:\\Users\\Administrator\\Desktop\\football\\item.prt", out partLoadStatus1);
Thread.Sleep(milliseconds);
//块复制
BLL.CopyBlockByZC("UNPARAMETERIZED_FEATURE(21)");
Thread.Sleep(milliseconds);
BLL.CopyBlockByOC("UNPARAMETERIZED_FEATURE(19)", "120");
Thread.Sleep(milliseconds);
BLL.CopyBlockByZC("UNPARAMETERIZED_FEATURE(37)");
Thread.Sleep(milliseconds);
BLL.CopyBlockByOC("UNPARAMETERIZED_FEATURE(32)", "-120");
Thread.Sleep(milliseconds);
BLL.CopyBlockByZC("UNPARAMETERIZED_FEATURE(43)");
Thread.Sleep(milliseconds);
//半球复制
BLL.CopyBall();
//隐藏参考线
BLL.GuidesHidden();
}
catch (NXOpen.NXException ex)
{
theUI.NXMessageBox.Show("Block Styler", NXMessageBox.DialogType.Error, ex.ToString());
}
return retValue;
}
}
制作过程主要分以下几步:
第一步:制作合成足球的白块和黑块标准件,制作过程大家可以网上查一下,做法颇多,但是结果大同小异,这里我就不过多说了。下面有我做的一个版本的免费下载地址:https://download.csdn.net/download/MarcoPro/87253404
第二步:程序自动导入第一步已经做好的标准件
BasePart basePart1;
PartLoadStatus partLoadStatus1;
basePart1 = theSession.Parts.OpenBaseDisplay(filePath, out partLoadStatus1);
第三步:根据足球的白块和黑块的排列规律,通过UG阵列按照一定的规律复制标准件,构成足球,这里主要用到2个方法
/// <summary>
/// 块复制,按照zc轴复制
/// </summary>
/// <param name="JournalIdentifier">复制对象</param>
public static void CopyBlockByZC(string JournalIdentifier)
{
Session theSession = Session.GetSession();
Part workPart = theSession.Parts.Work;
Part displayPart = theSession.Parts.Display;
NXOpen.Features.MoveObject nullFeatures_MoveObject = null;
NXOpen.Features.MoveObjectBuilder moveObjectBuilder1;
moveObjectBuilder1 = workPart.BaseFeatures.CreateMoveObjectBuilder(nullFeatures_MoveObject);
moveObjectBuilder1.TransformMotion.DistanceAngle.OrientXpress.AxisOption = NXOpen.GeometricUtilities.OrientXpressBuilder.Axis.Passive;
moveObjectBuilder1.TransformMotion.DistanceAngle.OrientXpress.PlaneOption = NXOpen.GeometricUtilities.OrientXpressBuilder.Plane.Passive;
moveObjectBuilder1.TransformMotion.OrientXpress.AxisOption = NXOpen.GeometricUtilities.OrientXpressBuilder.Axis.Passive;
moveObjectBuilder1.TransformMotion.OrientXpress.PlaneOption = NXOpen.GeometricUtilities.OrientXpressBuilder.Plane.Passive;
Point3d manipulatororigin1;
manipulatororigin1 = moveObjectBuilder1.TransformMotion.ManipulatorOrigin;
Matrix3x3 manipulatormatrix1;
manipulatormatrix1 = moveObjectBuilder1.TransformMotion.ManipulatorMatrix;
moveObjectBuilder1.TransformMotion.Option = NXOpen.GeometricUtilities.ModlMotion.Options.Angle;
moveObjectBuilder1.MoveObjectResult = NXOpen.Features.MoveObjectBuilder.MoveObjectResultOptions.CopyOriginal;
moveObjectBuilder1.TransformMotion.Angle.RightHandSide = "72"; //旋转角度
moveObjectBuilder1.NumberOfCopies = 5; //复制数量
Point3d origin1 = new Point3d(0.0, 0.0, 0.0); //轴点
Vector3d vector1 = new Vector3d(0.0, 0.0, 1.0); //矢量
Direction direction1;
direction1 = workPart.Directions.CreateDirection(origin1, vector1, NXOpen.SmartObject.UpdateOption.WithinModeling);
Point nullPoint = null;
Axis axis1;
axis1 = workPart.Axes.CreateAxis(nullPoint, direction1, NXOpen.SmartObject.UpdateOption.WithinModeling);
moveObjectBuilder1.TransformMotion.AngularAxis = axis1;
Body body1 = (Body)workPart.Bodies.FindObject(JournalIdentifier); //复制对象
bool added1;
added1 = moveObjectBuilder1.ObjectToMoveObject.Add(body1);
Scalar scalar1;
scalar1 = workPart.Scalars.CreateScalar(1.0, NXOpen.Scalar.DimensionalityType.None, NXOpen.SmartObject.UpdateOption.WithinModeling);
Sketch sketch1 = (Sketch)workPart.Sketches.FindObject("SKETCH_004");
Line line1 = (Line)sketch1.FindObject("HANDLE R-42129");
Point point1;
point1 = workPart.Points.CreatePoint(line1, scalar1, NXOpen.SmartObject.UpdateOption.WithinModeling);
axis1.Point = point1;
moveObjectBuilder1.TransformMotion.AngularAxis = axis1;
NXObject nXObject1;
nXObject1 = moveObjectBuilder1.Commit();
NXObject[] objects1;
objects1 = moveObjectBuilder1.GetCommittedObjects();
moveObjectBuilder1.Destroy();
}
/// <summary>
/// 块复制,按照白块参考线复制
/// </summary>
/// <param name="JournalIdentifier">复制对象</param>
/// <param name="angle">旋转角度</param>
public static void CopyBlockByOC(string JournalIdentifier, string angle)
{
Session theSession = Session.GetSession();
Part workPart = theSession.Parts.Work;
Part displayPart = theSession.Parts.Display;
NXOpen.Features.MoveObject nullFeatures_MoveObject = null;
NXOpen.Features.MoveObjectBuilder moveObjectBuilder1;
moveObjectBuilder1 = workPart.BaseFeatures.CreateMoveObjectBuilder(nullFeatures_MoveObject);
moveObjectBuilder1.TransformMotion.DistanceAngle.OrientXpress.AxisOption = NXOpen.GeometricUtilities.OrientXpressBuilder.Axis.Passive;
moveObjectBuilder1.TransformMotion.DistanceAngle.OrientXpress.PlaneOption = NXOpen.GeometricUtilities.OrientXpressBuilder.Plane.Passive;
moveObjectBuilder1.TransformMotion.OrientXpress.AxisOption = NXOpen.GeometricUtilities.OrientXpressBuilder.Axis.Passive;
moveObjectBuilder1.TransformMotion.OrientXpress.PlaneOption = NXOpen.GeometricUtilities.OrientXpressBuilder.Plane.Passive;
Point3d manipulatororigin1;
manipulatororigin1 = moveObjectBuilder1.TransformMotion.ManipulatorOrigin;
moveObjectBuilder1.TransformMotion.Option = NXOpen.GeometricUtilities.ModlMotion.Options.Angle;
moveObjectBuilder1.MoveObjectResult = NXOpen.Features.MoveObjectBuilder.MoveObjectResultOptions.CopyOriginal;
moveObjectBuilder1.TransformMotion.Angle.RightHandSide = angle;
Body body1 = (Body)workPart.Bodies.FindObject(JournalIdentifier);
bool added1;
added1 = moveObjectBuilder1.ObjectToMoveObject.Add(body1);
Scalar scalar1;
scalar1 = workPart.Scalars.CreateScalar(0.5, NXOpen.Scalar.DimensionalityType.None, NXOpen.SmartObject.UpdateOption.WithinModeling);
Sketch sketch1 = (Sketch)workPart.Sketches.FindObject("SKETCH_004");
Line line1 = (Line)sketch1.FindObject("HANDLE R-42129");
Point point1;
point1 = workPart.Points.CreatePoint(line1, scalar1, NXOpen.SmartObject.UpdateOption.WithinModeling);
NXObject nXObject1;
Xform xform1;
xform1 = workPart.Xforms.CreateExtractXform(line1, NXOpen.SmartObject.UpdateOption.WithinModeling, false, out nXObject1);
Scalar scalar2;
scalar2 = workPart.Scalars.CreateScalar(50.0, NXOpen.Scalar.DimensionalityType.None, NXOpen.SmartObject.UpdateOption.WithinModeling);
Line line2 = (Line)nXObject1;
Point point2;
point2 = workPart.Points.CreatePoint(line2, scalar2, NXOpen.PointCollection.PointOnCurveLocationOption.PercentParameter, NXOpen.SmartObject.UpdateOption.WithinModeling);
Direction direction1;
direction1 = workPart.Directions.CreateDirection(line2, Sense.Reverse, NXOpen.SmartObject.UpdateOption.WithinModeling);
Point nullPoint = null;
Axis axis1;
axis1 = workPart.Axes.CreateAxis(nullPoint, direction1, NXOpen.SmartObject.UpdateOption.WithinModeling);
moveObjectBuilder1.TransformMotion.AngularAxis = axis1;
NXObject nXObject2;
nXObject2 = moveObjectBuilder1.Commit();
NXObject[] objects1;
objects1 = moveObjectBuilder1.GetCommittedObjects();
moveObjectBuilder1.Destroy();
}
第三步:完成半个足球的排列之后,直接对半球进行复制操作
/// <summary>
/// 半球复制
/// </summary>
public static void CopyBall()
{
Session theSession = Session.GetSession();
Part workPart = theSession.Parts.Work;
Part displayPart = theSession.Parts.Display;
NXOpen.Features.MoveObject nullFeatures_MoveObject = null;
NXOpen.Features.MoveObjectBuilder moveObjectBuilder1;
moveObjectBuilder1 = workPart.BaseFeatures.CreateMoveObjectBuilder(nullFeatures_MoveObject);
moveObjectBuilder1.TransformMotion.DistanceAngle.OrientXpress.AxisOption = NXOpen.GeometricUtilities.OrientXpressBuilder.Axis.Passive;
moveObjectBuilder1.TransformMotion.DistanceAngle.OrientXpress.PlaneOption = NXOpen.GeometricUtilities.OrientXpressBuilder.Plane.Passive;
moveObjectBuilder1.TransformMotion.OrientXpress.AxisOption = NXOpen.GeometricUtilities.OrientXpressBuilder.Axis.Passive;
moveObjectBuilder1.TransformMotion.OrientXpress.PlaneOption = NXOpen.GeometricUtilities.OrientXpressBuilder.Plane.Passive;
Point3d manipulatororigin1;
manipulatororigin1 = moveObjectBuilder1.TransformMotion.ManipulatorOrigin;
Matrix3x3 manipulatormatrix1;
manipulatormatrix1 = moveObjectBuilder1.TransformMotion.ManipulatorMatrix;
moveObjectBuilder1.TransformMotion.Option = NXOpen.GeometricUtilities.ModlMotion.Options.Angle;
moveObjectBuilder1.MoveObjectResult = NXOpen.Features.MoveObjectBuilder.MoveObjectResultOptions.CopyOriginal;
moveObjectBuilder1.TransformMotion.Angle.RightHandSide = "180";
Point3d origin1 = new Point3d(0.0, 0.0, 0.0);
Vector3d vector1 = new Vector3d(1.0, 0.0, 0.0);
Direction direction1;
direction1 = workPart.Directions.CreateDirection(origin1, vector1, NXOpen.SmartObject.UpdateOption.WithinModeling);
Point nullPoint = null;
Axis axis1;
axis1 = workPart.Axes.CreateAxis(nullPoint, direction1, NXOpen.SmartObject.UpdateOption.WithinModeling);
moveObjectBuilder1.TransformMotion.AngularAxis = axis1;
Body body1 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(15)");
bool added1;
added1 = moveObjectBuilder1.ObjectToMoveObject.Add(body1);
Body body2 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(48)");
bool added2;
added2 = moveObjectBuilder1.ObjectToMoveObject.Add(body2);
bool added3;
added3 = moveObjectBuilder1.ObjectToMoveObject.Add(body2);
Body body3 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(17)");
bool added4;
added4 = moveObjectBuilder1.ObjectToMoveObject.Add(body3);
Body body4 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(19)");
bool added5;
added5 = moveObjectBuilder1.ObjectToMoveObject.Add(body4);
Body body5 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(21)");
bool added6;
added6 = moveObjectBuilder1.ObjectToMoveObject.Add(body5);
Body body6 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(32)");
bool added7;
added7 = moveObjectBuilder1.ObjectToMoveObject.Add(body6);
Body body7 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(33)");
bool added8;
added8 = moveObjectBuilder1.ObjectToMoveObject.Add(body7);
Body body8 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(34)");
bool added9;
added9 = moveObjectBuilder1.ObjectToMoveObject.Add(body8);
Body body9 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(35)");
bool added10;
added10 = moveObjectBuilder1.ObjectToMoveObject.Add(body9);
Body body10 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(36)");
bool added11;
added11 = moveObjectBuilder1.ObjectToMoveObject.Add(body10);
Body body11 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(37)");
bool added12;
added12 = moveObjectBuilder1.ObjectToMoveObject.Add(body11);
Body body12 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(38)");
bool added13;
added13 = moveObjectBuilder1.ObjectToMoveObject.Add(body12);
Body body13 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(39)");
bool added14;
added14 = moveObjectBuilder1.ObjectToMoveObject.Add(body13);
Body body14 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(40)");
bool added15;
added15 = moveObjectBuilder1.ObjectToMoveObject.Add(body14);
Body body15 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(41)");
bool added16;
added16 = moveObjectBuilder1.ObjectToMoveObject.Add(body15);
Body body16 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(42)");
bool added17;
added17 = moveObjectBuilder1.ObjectToMoveObject.Add(body16);
Body body17 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(43)");
bool added18;
added18 = moveObjectBuilder1.ObjectToMoveObject.Add(body17);
Body body18 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(44)");
bool added19;
added19 = moveObjectBuilder1.ObjectToMoveObject.Add(body18);
Body body19 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(45)");
bool added20;
added20 = moveObjectBuilder1.ObjectToMoveObject.Add(body19);
Body body20 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(46)");
bool added21;
added21 = moveObjectBuilder1.ObjectToMoveObject.Add(body20);
Body body21 = (Body)workPart.Bodies.FindObject("UNPARAMETERIZED_FEATURE(47)");
bool added22;
added22 = moveObjectBuilder1.ObjectToMoveObject.Add(body21);
bool added23;
added23 = moveObjectBuilder1.ObjectToMoveObject.Add(body21);
Scalar scalar1;
scalar1 = workPart.Scalars.CreateScalar(1.0, NXOpen.Scalar.DimensionalityType.None, NXOpen.SmartObject.UpdateOption.WithinModeling);
Sketch sketch1 = (Sketch)workPart.Sketches.FindObject("SKETCH_004");
Line line1 = (Line)sketch1.FindObject("HANDLE R-42129");
Point point1;
point1 = workPart.Points.CreatePoint(line1, scalar1, NXOpen.SmartObject.UpdateOption.WithinModeling);
axis1.Point = point1;
moveObjectBuilder1.TransformMotion.AngularAxis = axis1;
NXOpen.Session.UndoMarkId markId2;
markId2 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "Move Object");
NXObject nXObject1;
nXObject1 = moveObjectBuilder1.Commit();
NXObject[] objects1;
objects1 = moveObjectBuilder1.GetCommittedObjects();
moveObjectBuilder1.Destroy();
}
第四步:隐藏参考线,完成足球制作
/// <summary>
/// 隐藏参考线
/// </summary>
public static void GuidesHidden()
{
Session theSession = Session.GetSession();
Part workPart = theSession.Parts.Work;
Part displayPart = theSession.Parts.Display;
DisplayableObject[] objects1 = new DisplayableObject[3];
Sketch sketch1 = (Sketch)workPart.Sketches.FindObject("SKETCH_004");
Line line1 = (Line)sketch1.FindObject("HANDLE R-42129");
objects1[0] = line1;
objects1[1] = sketch1;
Line line2 = (Line)sketch1.FindObject("HANDLE R-42094");
objects1[2] = line2;
theSession.DisplayManager.BlankObjects(objects1);
}
最后,祝大家开开心心看球,安安稳稳防疫,愿大家在世界杯召开的这一个月里,像德罗巴一样自信执着,像C罗一样桃花朵朵,像哈维一样创意颇多,像梅西一样激情四射,像国足一样超越自我。