From 11ff5e343d5a9a0b33d41359eeb0cda33fad1b6d Mon Sep 17 00:00:00 2001 From: iambossTC Date: Tue, 8 Apr 2025 19:35:28 +0800 Subject: [PATCH] re-init --- .gitattributes | 63 ++++++ .gitignore | 268 +++++++++++++++++++++++ Geom/DemoBuildGeom.cs | 29 +++ Hi.Sample.csproj | 36 +++ HiAPI_license.md | 60 +++++ MachineTool/DemoBuildEmptyMachineTool.cs | 38 ++++ MachineTool/DemoBuildMachineTool.cs | 82 +++++++ Machining/DemoBuildMachiningProject.cs | 216 ++++++++++++++++++ Machining/DemoUseMachiningProject.cs | 94 ++++++++ Properties/launchSettings.json | 12 + techcoordinate.ico | Bin 0 -> 52436 bytes 11 files changed, 898 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 Geom/DemoBuildGeom.cs create mode 100644 Hi.Sample.csproj create mode 100644 HiAPI_license.md create mode 100644 MachineTool/DemoBuildEmptyMachineTool.cs create mode 100644 MachineTool/DemoBuildMachineTool.cs create mode 100644 Machining/DemoBuildMachiningProject.cs create mode 100644 Machining/DemoUseMachiningProject.cs create mode 100644 Properties/launchSettings.json create mode 100644 techcoordinate.ico diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6d95f9c --- /dev/null +++ b/.gitignore @@ -0,0 +1,268 @@ +!*.lib + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +project.fragment.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +#*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +!hasp*.exe +!hasp*.dll +!HiLock.dll +!Aladdin*.dll diff --git a/Geom/DemoBuildGeom.cs b/Geom/DemoBuildGeom.cs new file mode 100644 index 0000000..ed287d0 --- /dev/null +++ b/Geom/DemoBuildGeom.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using Hi.Geom; +using Hi.Mech.Topo; + +namespace Sample.Geom +{ + public static class DemoBuildGeom + { + public static List GenGeoms() + { + Box3d box = new Box3d(0, 0, -50, 70, 50, 0); + Cylindroid cylindroid = new Cylindroid() + { + PairZrs = new List([ new PairZr(0,12),new PairZr(20,12), + new PairZr(20,16),new PairZr(30,16)]), + LongitudeNum = 30 + }; + Stl stl = new Stl("geom.stl"); + TransformationGeom transformationGeom = new TransformationGeom() + { + Transformer = new GeneralTransform(1, + new StaticRotation(new Vec3d(0, 0, 1), MathUtil.ToRad(15), new Vec3d(0, 0, 0)), + new StaticTranslation(new Vec3d(0, 0, 0))), + Geom = stl + }; + return new List([box, cylindroid, stl, transformationGeom]); + } + } +} diff --git a/Hi.Sample.csproj b/Hi.Sample.csproj new file mode 100644 index 0000000..40e5e15 --- /dev/null +++ b/Hi.Sample.csproj @@ -0,0 +1,36 @@ + + + Exe + net9.0 + x64 + true + Hi.Sample + Sample + + HiAPI samples. + + Demo;Maintenance + 0 + 1.4.$(VersionBuild) + $(AssemblyName) + techcoordinate.ico + Copyright 2025 Tech Coordinate Co., Ltd. + Tech Coordinate Co., Ltd. + Tech Coordinate Co., Ltd. + bin\$(Platform).$(Configuration)\ + + + + + + + + + + + DEBUG;TRACE + Sample.Machining.DemoUseMachiningProject + + + + \ No newline at end of file diff --git a/HiAPI_license.md b/HiAPI_license.md new file mode 100644 index 0000000..c8cd65e --- /dev/null +++ b/HiAPI_license.md @@ -0,0 +1,60 @@ +# HiAPI使用者條款 + +甲方:超級高科技股份有限公司 + +乙方:使用者 + +茲 甲方授權乙方使用 HiAPI軟體模組 一式,特立此書,乙方已閱讀並同意下列使用者條款: + +## 第一條、標的物 + +HiAPI軟體模組(以下簡稱本模組),內容、授權期間請見甲方提供之規格表。 + +## 第二條、智慧財產權保護及保密義務 + +一、本模組之結構、組織及代碼均屬於甲方所有的有價商業秘密和機密資訊,甲方提供之本模組及其所有相關資料,其智慧財產權均歸甲方所有。本模組僅供乙方內部使用,乙方同意依照使用者條款規範使用本模組,乙方不得出租、租賃、授權、移轉或販賣本組軟體、將本模組提供給第三方,亦不能修改、翻譯、逆向工程、反組譯、解譯本組軟體程序。 + +二、乙方開發之衍生軟體,其衍生智財及收入歸乙方。 + +三、乙方基於本模組開發之衍生軟體須甲方授權,第三方才可使用。 + +## 第三條、軟體確保之限制 + +本模組僅以「現貨」狀態為準,任何其它直接或隱含的表示,描述或擔保均不在確保之內。甲方及其經銷商對於特殊的、因其它事件而引起直接、間接或其它原因造成的損害,不負賠償責任。凡使用本模組所產生之結果及效能均由乙方自行承擔全部風險。 + +## 第四條、資訊蒐集 + +一、乙方同意提供本模組紀錄使用次數、使用時間及部份硬體資訊給甲方。 + +二、在乙方被授權電腦有連接網際網路之情況下,乙方同意將本條第一項所列資訊由本模組以網路傳輸方式傳遞給甲方。 + +三、所有紀錄及傳輸資訊,僅限於供甲方授權驗證及軟體保護之目的使用,將不會公開揭露於第三者或作為第三方使用。 + +## 第五條、同意條款 + +乙方安裝甲方軟體時,系統將會顯示「使用者條款」的條款和條件,乙方必須接受「使用者條 +款」的條款和條件,才能使用軟體產品,如果不同意「使用者條款」的條款和條件,則請勿安 +裝、複製、使用、存取或執行軟體產品,並立即向您的購買點提交書面退貨通知,行使「使用 +者條款」中所賦予的權利,即表示乙方同意遵守其條款和條件。 + +## 第六條、違約責任 + +若使用者違反本使用者條款之全部或部分,甲方有權自行判斷並採取其認為適當的措施,包括 +終止甲方與使用者間之合約、立刻暫停使用者使用本模組或甲方之其他服務,亦不排除對此等 +使用者採取法律行動。 + +## 第七條、一部無效 + +本使用者條款部分條款依法被認為無效時,其他條款仍應繼續有效。 + +(以下空白) + +甲 方:超級高科技股份有限公司 + +代表人:梅可人 董事長 + +統一編號:24921337 + +地址:台南市永康區忠義街60 巷3 號9 樓之11 + +日期:2020年1月27日 diff --git a/MachineTool/DemoBuildEmptyMachineTool.cs b/MachineTool/DemoBuildEmptyMachineTool.cs new file mode 100644 index 0000000..ac10e4f --- /dev/null +++ b/MachineTool/DemoBuildEmptyMachineTool.cs @@ -0,0 +1,38 @@ +using Hi.Geom; +using Hi.Mech.Topo; +using Hi.NcMech.Xyzabc; +using Hi.Numerical.Xyzabc; + +namespace Sample.MachineTool +{ + /// + /// Demo generating empty machine tool instances for testing or development. + /// + public static class DemoBuildEmptyMachineTool + { + /// + /// Generates an empty machine tool with basic configuration. + /// + /// A configured but empty machine tool without solids. + public static CodeXyzabcMachineTool GenEmptyMachineTool() + { + CodeXyzabcChain chain = new CodeXyzabcChain("[O][C][w];[O][X][Y][Z][B][S][t]"); + if (chain.ToolBuckleTransformer is StaticTranslation st) + st.Trans = new Vec3d(-200, 200, 400); + CodeXyzabcMachineTool xyzabcMachineTool = new CodeXyzabcMachineTool(chain); + return xyzabcMachineTool; + } + /// + /// Generates and saves an empty machine tool URI to a file. + /// + /// The base directory to save the machine tool file. + /// The machine tool URI object that was created and saved. + public static CodeXyzabcMachineToolUri GenEmptyMachineToolUri(string baseDirectory) + { + CodeXyzabcMachineToolUri machineToolUri = new CodeXyzabcMachineToolUri(@"Samples/EmpytMachineTool.mt", + GenEmptyMachineTool()); + machineToolUri.SaveToUri(baseDirectory); + return machineToolUri; + } + } +} diff --git a/MachineTool/DemoBuildMachineTool.cs b/MachineTool/DemoBuildMachineTool.cs new file mode 100644 index 0000000..7cf50a3 --- /dev/null +++ b/MachineTool/DemoBuildMachineTool.cs @@ -0,0 +1,82 @@ +using Hi.Common.XmlUtils; +using Hi.Geom; +using Hi.Mech; +using Hi.Mech.Topo; +using Hi.NcMech; +using Hi.NcMech.Solids; +using Hi.NcMech.Xyzabc; +using Hi.Numerical.Xyzabc; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Xml.Linq; + +namespace Sample.MachineTool +{ + /// + /// Provides access to the PMC-B1 machine tool model. + /// + public class DemoBuildMachineTool : IGetCodeXyzabcMachineTool + { + static DemoBuildMachineTool() + { + XFactory.Default.Regs.Add(XName, (xml, baseDirectory, relFile, res) => new DemoBuildMachineTool()); + } + /// + /// Generates an XYZ-ABC machine tool instance from embedded resources. + /// + /// A configured machine tool model. + public static CodeXyzabcMachineTool GenXyzabcMachineTool() + { + CodeXyzabcChain chain = new CodeXyzabcChain("[O][Y][X][C][w];[O][Z][B][S][t]"); + if (chain.ToolBuckleTransformer is StaticTranslation st) + st.Trans = new Vec3d(-72.40, 72.40, 176.44); + chain.TransformerB.Pivot = new Vec3d(-72.4, -177.4, 225.94); + Dictionary solidMap = new Dictionary() + { + ["O"] = new Solid(new Stl("MachineTool/base.stl")), + ["X"] = new Solid(new Stl("MachineTool/X.stl")), + ["Y"] = new Solid(new Stl("MachineTool/Y.stl")), + ["Z"] = new Solid(new Stl("MachineTool/Z.stl")), + ["B"] = new Solid(new Stl("MachineTool/B.stl")), + ["C"] = new Solid(new Stl("MachineTool/C.stl")), + ["S"] = new Solid(new Stl("MachineTool/spindle.stl")), + }; + chain.AnchorToSolid.BuildAnchorToSolid( + chain.Asmb.GetDescendantAnchors(), solidMap); + + CodeXyzabcMachineTool dst = new CodeXyzabcMachineTool(chain); + dst.GenerateCollisionIndexPairs(); + return dst; + } + + /// + /// The cached machine tool instance. + /// + CodeXyzabcMachineTool MachineTool { get; } + + /// + /// Default constructor that initializes the machine tool model. + /// + public DemoBuildMachineTool() + { + MachineTool = GenXyzabcMachineTool(); + } + #region XML IO + //public PmcB1MachineToolSource(XElement src, object res) : this() { } + /// + /// XML element name for serialization. + /// + public static string XName = nameof(DemoBuildMachineTool); + /// + public XElement ToXElement() => new XElement(XName); + #endregion + /// + public CodeXyzabcMachineTool GetXyzabcMachineTool() => MachineTool; + /// + public IMachiningChain GetMachiningChain() => MachineTool; + /// + public ISolidMachiningChain GetSolidMachiningChain() => MachineTool; + } +} diff --git a/Machining/DemoBuildMachiningProject.cs b/Machining/DemoBuildMachiningProject.cs new file mode 100644 index 0000000..293cde1 --- /dev/null +++ b/Machining/DemoBuildMachiningProject.cs @@ -0,0 +1,216 @@ +using System; +using System.Collections.Generic; +using Hi.Milling.Apts; +using Hi.Common.XmlUtils; +using Hi.Geom; +using Hi.Machining; +using Hi.Mech.Topo; +using Hi.Milling.Cutters; +using Hi.Milling.FluteContours; +using Hi.MillingForces.Fittings; +using Hi.MillingMech.MillingTools; +using Hi.NcMech.Fixtures; +using Hi.NcMech.Holders; +using Hi.NcMech.Workpieces; +using Hi.NcMech.Xyzabc; +using Hi.NcOpt; +using Hi.Physics; +using Hi.MongoUtils; +using Hi.Licenses; +using Hi.MachiningProcs; +using System.IO; + +namespace Sample.Machining +{ + public static class DemoBuildMachiningProject + { + #region CreateMillingCutter1 + private static MillingCutter CreateMillingCutter1() + { + MillingCutter millingCutter = new MillingCutter() + { + UpperBeamGeom = new TransformationGeom(), + MillingCutterOptLimit = new MillingCutterOptLimit() + }; + // since the following properties of MillingCutter has self-invoke, + // they have to be seperated from the initializer syntex. + + //build ShaperProfile property + double diameter_mm = 12; + double roundRadius_mm = 0.5; + millingCutter.ShaperProfile = new AptProfile(millingCutter, + new ColumnApt() + { + Diameter_mm = diameter_mm, + Rc_mm = roundRadius_mm, + FluteHeight_mm = 40 + }); + + //build FluteContourTray property + double helixAngle_deg = 50; + double radialRakeAngle_deg = 15; + double bottomOuterRadius_mm = diameter_mm / 2 - roundRadius_mm; + millingCutter.FluteContourTray = new UniformContourTray() + { + TrackNum = 3, + BaselineOneContour = new FluteContour() + { + BaseSideContour = new ConstHelixSideContour(millingCutter) + { + Helix_deg = helixAngle_deg, + RadialRakeAngle_deg = radialRakeAngle_deg + }, + BaseBottomContour = new SlideBottomContour() + { + //In most case, helix angle from side equal to rake angle from bottom. + AxialRakeAngle_deg = MathUtil.ToDeg(helixAngle_deg), + DiskAngle_deg = 1.5, + //In most case, rake angle from side equal to eccentric angle from bottom. + EccentricAngle_deg = radialRakeAngle_deg, + CutterLengthOnBottomProjection_mm = bottomOuterRadius_mm * 0.9, + OuterRadius_mm = bottomOuterRadius_mm + } + } + }; + + millingCutter.InnerBeamProfile + = new FluteDependentRatioProfile(millingCutter); + + return millingCutter; + } + #endregion + + #region CreateMillingCutter2 + private static MillingCutter CreateMillingCutter2() + { + MillingCutter millingCutter = new MillingCutter() + { + UpperBeamGeom = new TransformationGeom(), + MillingCutterOptLimit = new MillingCutterOptLimit() + }; + + //build ShaperProfile property + double diameter_mm = 12; + millingCutter.ShaperProfile = new AptProfile(millingCutter, + new ColumnApt() + { + Diameter_mm = diameter_mm, + FluteHeight_mm = 40 + }); + + //build FluteContourTray property + double helixAngle_deg = 50; + double radialRakeAngle_deg = 15; + millingCutter.FluteContourTray = new UniformContourTray() + { + TrackNum = 3, + BaselineOneContour = new FluteContour() + { + BaseSideContour = new ConstHelixSideContour(millingCutter) + { + Helix_deg = helixAngle_deg, + RadialRakeAngle_deg = radialRakeAngle_deg + }, + //since no bottom cut, set bottom contour to null. + BaseBottomContour = null + } + }; + + millingCutter.InnerBeamProfile + = new FluteDependentRatioProfile(millingCutter); + + return millingCutter; + } + #endregion + + #region TestMethod + [STAThread] + public static void Test() + { + Console.WriteLine($"License Login."); + License.LogInAll(); + + Console.WriteLine($"Start Database."); + MongoServer.Default = MongoServer.Run(new MongoRunnerOptions() + { + MongoPort = 28100 + }); + + var projectPath = "C:/HiNC-Projects/NewProject/Main.hincproj"; + var projectDirectory = Path.GetDirectoryName(projectPath); + Console.WriteLine($"Directory of the New Project: {projectDirectory}"); + MachiningProject machiningProject = new MachiningProject(projectDirectory); + + #region ConfigureHolder + CylindroidHolder cylindroidHolder = new CylindroidHolder() + { + Note = "BT40", + Cylindroid = new Cylindroid() + { + PairZrs = new List([ new PairZr(0,12),new PairZr(20,12), + new PairZr(20,16),new PairZr(30,16)]), + LongitudeNum = 30 + } + }; + #endregion + + #region ConfigureMachiningToolHouse + machiningProject.MachiningToolHouse = new MachiningToolHouse() + { + [1] = new StickMachiningTool() + { + Note = "T1", + PreservedDistanceBetweenFluteAndSpindleNose_mm = 8, + Holder = cylindroidHolder, + Cutter = CreateMillingCutter1() + }, + [2] = new StickMachiningTool() + { + Note = "T2", + PreservedDistanceBetweenFluteAndSpindleNose_mm = 8, + Holder = cylindroidHolder, + Cutter = CreateMillingCutter2() + }, + [3] = new StickMachiningTool() + { + Note = "T3", + PreservedDistanceBetweenFluteAndSpindleNose_mm = 8, + Holder = cylindroidHolder, + Cutter = CreateMillingCutter1() + }, + }; + #endregion + + #region ConfigureFixture + machiningProject.MachiningEquipment.Fixture = new Fixture() + { + Geom = new Box3d(new Vec3d(-40, -40, 0), new Vec3d(40, 40, 10)), + TableToWorkpieceTransformer = new StaticTranslation(new Vec3d(0, 0, 10)), + }; + #endregion + + #region ConfigureWorkpiece + machiningProject.MachiningEquipment.Workpiece = new Workpiece() + { + InitResolution = 0.25, + InitGeom = new Box3d(0, 0, -50, 70, 50, 0), + IdealGeom = null, + WorkpieceGeomToFixtureBuckleTransformer = new StaticTranslation(new Vec3d(0, 0, 0)), + MillingPara = XFactory.Default.GenByFile( + "Resource/CuttingParameter", "Al6061T6.mp", GenMode.Default), + WorkpieceMaterial = XFactory.Default.GenByFile( + "Resource/WorkpieceMaterial", "Al6061T6.WorkpieceMaterial", GenMode.Default), + }; + #endregion + + #region ConfigureMachineChain + machiningProject.MachiningEquipment.SolidMachiningChain + = XFactory.Default.GenByFile( + "Resource/MachineTool", "PMC-B1/PMC-B1.mt", GenMode.Default); + #endregion + + machiningProject.MakeXmlSourceFile(projectPath); + } + #endregion + } +} diff --git a/Machining/DemoUseMachiningProject.cs b/Machining/DemoUseMachiningProject.cs new file mode 100644 index 0000000..57f57b0 --- /dev/null +++ b/Machining/DemoUseMachiningProject.cs @@ -0,0 +1,94 @@ +using System; +using Hi.Licenses; +using Hi.Common.Messages; +using Hi.MachiningProcs; +using Hi.Common.FileLines; +using Hi.MongoUtils; + +namespace Sample.Machining +{ + public static class DemoUseMachiningProject + { + #region LoadProjectFileAndRunNcFiles + static void LoadProjectFileAndRunNcFiles() + { + #region LicenseAndDatabaseSetup + Console.WriteLine($"License Login."); + License.LogInAll(); + + Console.WriteLine($"Start Database."); + MongoServer.Default = MongoServer.Run(new MongoRunnerOptions() + { + MongoPort = 28100 + }); + #endregion + + #region ProjectLoading + var projectPath = "C:/HiNC-Projects/DemoStandardPath/Main.hincproj"; + Console.WriteLine($"Load Project: {projectPath}"); + MachiningProject machiningProject = MachiningProject.LoadFile(projectPath); + #endregion + + #region EventHandling + Console.WriteLine($"Set message event."); + //show message if something abnormal. + machiningProject.SessionMessageHost.CollectionItemAdded += pack => + { + if (pack.Tags.Contains(MessageFlag.Warning.ToString()) || + pack.Tags.Contains(MessageFlag.Error.ToString()) || + pack.Tags.Contains(MessageFlag.SysErr.ToString())) + { + var sourceCommand = pack.SourceCommand; + Console.WriteLine($"{pack.Message} At \"{sourceCommand?.FilePath}\" (Line {sourceCommand?.GetLineNo()}) \"{sourceCommand?.Line}\""); + } + }; + Console.WriteLine($"Set machining step event."); + //show MRR. + machiningProject.ShellApi.MachiningStepBuilt += (preStep, curStep) => + { + var sourceCommand = curStep.SourceCommand; + if (curStep.Mrr_mm3ds > 500) //show only the step that contains large MRR. + Console.WriteLine($"MRR = {curStep.Mrr_mm3ds} At \"{sourceCommand?.FilePath}\" (Line {sourceCommand?.GetLineNo()}) \"{sourceCommand?.Line}\""); + }; + #endregion + + #region MachiningExecution + Console.WriteLine($"Reset runtime status."); + machiningProject.ResetRuntime(); + + Console.WriteLine($"Session begin."); + machiningProject.BeginSession(); + machiningProject.ShellApi.MachiningResolution_mm = 1; + machiningProject.ShellApi.EnableCollisionDetection = true; + machiningProject.ShellApi.EnablePauseOnCollision = false; + machiningProject.ShellApi.EnableMillingForceEvaluation = false; + //the path from Shell-API is relative by project directory. + machiningProject.ShellApi.PlayNcFile("NC/side.ptp"); + machiningProject.ShellApi.PlayNcFile("NC/circle.ptp"); + machiningProject.EndSession(); + Console.WriteLine($"Session end."); + #endregion + + #region CleanupResources + Console.WriteLine($"Close Project: {projectPath}"); + machiningProject.Dispose(); + + Console.WriteLine($"Close Database."); + MongoServer.Default.Dispose(); + + Console.WriteLine($"License Logout."); + License.LogOutAll(); + + Console.WriteLine($"Program end."); + #endregion + } + #endregion + + #region Main + public static void Main(string[] args) + { + LoadProjectFileAndRunNcFiles(); + } + #endregion + } +} diff --git a/Properties/launchSettings.json b/Properties/launchSettings.json new file mode 100644 index 0000000..adae572 --- /dev/null +++ b/Properties/launchSettings.json @@ -0,0 +1,12 @@ +{ + "profiles": { + "HiAPI.Sample": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:52376;http://localhost:52377" + } + } +} \ No newline at end of file diff --git a/techcoordinate.ico b/techcoordinate.ico new file mode 100644 index 0000000000000000000000000000000000000000..1aa69cece18e2f058a85c81f418461cb34b48788 GIT binary patch literal 52436 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≪8+WLXbXjL2mA@X>OkW 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 C{~8nk literal 0 HcmV?d00001