CAM API
  • CAM API
v20.0.1
Search Results for

    Show / Hide Table of Contents

    Подключение к CAM-системе из приложения C#

    В состав установленной CAM-системы входят:

    • CAMIPC.Helper.Cam.dll с экспортируемой функцией CreateHelper. Она возвращает объект интерфейса IIpcHelper, методы которого позволяют подключиться к работающему экземпляру CAM-системы или запустить новый;
    • NativeLibUtils.dll — библиотека, упрощающая загрузку и выгрузку native DLL.

    В файл .csproj необходимо добавить:

    • Ссылку на NativeLibUtils.dll с указанием пути;
    • Ссылку на пакет CAMIPC SDK;
    <ItemGroup>
        <PackageReference Include="SprutTechnology.CAMIPC.SDK.Net" Version="18.2.0" />
        <Reference Include="C:\Program Files\Sprut Technology\SprutCAM 18\Bin64\NativeLibUtils.dll" />
    </ItemGroup>
    

    Вспомогательный singleton

    Открытый метод GetApplication() этого класса подключается к работающему экземпляру CAM-системы.

    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    using CAMAPI.ResultStatus;
    using CAMIPC.Application;
    using CAMIPC.ExecuteContext;
    using CAMIPC.Helper;
    using SprutTechnology.NativeLibUtils;
    
    namespace ApplicationEmptyNet;
    
    public static class CamHelper
    {
        private static IIpcHelper? _helper;
        private static ICamIpcApplication? _application;
        private static IntPtr _helperObjectPtr;
        private static IntPtr _helperDllPtr;
        private delegate IntPtr CreateHelperDelegate();
    
        /// <summary>
        /// Connect to CAM application
        /// </summary>
        private static IIpcHelper GetHelper()
        {
            if (_helper != null)
                return _helper;
    
            const string camFolder = @"C:\Program Files\Sprut Technology\SprutCAM NB 18\Bin64";
            var helperPath = Path.Combine(camFolder, "CAMIPC.Helper.Cam.dll");
            if (!File.Exists(helperPath))
                throw new Exception($"{helperPath} not found");
    
            _helper = NativeLibLoader.CreateComObject<IIpcHelper, CreateHelperDelegate>(
                          helperPath, "CreateHelper", out _helperObjectPtr, out _helperDllPtr)
                      ?? throw new Exception("Can't create helper");
    
            return _helper;
        }
    
        /// <summary>
        /// Get instance of running CAM application to interact with it
        /// </summary>
        public static ICamIpcApplication GetApplication()
        {
            if (_application != null)
                return _application;
    
            var executeContext = new TExecuteContext();
            var instances = GetHelper().GetRunningCamAppList(ref executeContext);
            if (executeContext.ResultStatus.Code == TResultStatusCode.rsError)
                throw new Exception(executeContext.ResultStatus.Description);
            if (instances.Count == 0)
                throw new Exception("SprutCAM running instance not found");
    
            _application = instances.Get(0, executeContext);
            if (executeContext.ResultStatus.Code == TResultStatusCode.rsError)
                throw new Exception(executeContext.ResultStatus.Description);
    
            return _application;
        }
    
        /// <summary>
        /// Destructor. Release COM objects
        /// </summary>
        public static void Clean()
        {
            if (_helper != null)
            {
                if (_application != null)
                    Marshal.ReleaseComObject(_application);
                NativeLibLoader.FreeDll(_helper, _helperObjectPtr, _helperDllPtr);
            }
        }
    }
    

    Изменение singleton

    Интерфейс IIpcHelper предоставляет методы для следующих действий:

    • Подключиться к первому найденному экземпляру, как в примере выше;
    • Подключиться к CAM-системе по PID процесса;
    • Запустить новый экземпляр CAM-системы и подключиться к нему.
    In this article