public void BuildProcessing(ITechProcess techProcess) { try { Acad.Write($"Выполняется расчет обработки по техпроцессу {techProcess.Caption} ..."); var stopwatch = Stopwatch.StartNew(); Acad.DeleteObjects(techProcess.ToolpathObjectIds); Acad.DeleteExtraObjects(); Acad.Editor.UpdateScreen(); techProcess.BuildProcessing(); stopwatch.Stop(); Acad.Write($"Расчет обработки завершен {stopwatch.Elapsed}"); } catch (Autodesk.AutoCAD.Runtime.Exception ex) { techProcess.DeleteProcessCommands(); if (ex.ErrorStatus == Autodesk.AutoCAD.Runtime.ErrorStatus.UserBreak) { Acad.Write("Расчет прерван"); } else { Acad.Alert("Ошибка при выполнении расчета", ex); } } catch (Exception ex) { techProcess.DeleteProcessCommands(); Acad.Alert("Ошибка при выполнении расчета", ex); } Acad.Editor.UpdateScreen(); }
public ParamsView AddOrigin() { var originX = _type.GetProperty("OriginX"); var originY = _type.GetProperty("OriginY"); var originObject = _type.GetField(nameof(MillingTechProcess.OriginObject)); var selector = CreateSelector("Начало координат", "۞"); var textBox = selector.Controls[0]; BindingSource.DataSourceChanged += (s, e) => RefreshText(); textBox.Enter += (s, e) => Acad.SelectObjectIds((ObjectId[])originObject?.GetValue(ParamsObject)); var button = selector.Controls[1]; button.Click += (s, e) => { Interaction.SetActiveDocFocus(); var point = Interaction.GetPoint("\nВыберите точку начала координат"); if (!point.IsNull()) { originX.SetValue(ParamsObject, point.X.Round(3)); originY.SetValue(ParamsObject, point.Y.Round(3)); RefreshText(); if (originObject.GetValue(ParamsObject) != null) { Acad.DeleteObjects((ObjectId[])originObject.GetValue(ParamsObject)); } originObject.SetValue(ParamsObject, Acad.CreateOriginObject(point)); } }; return(this); void RefreshText() => textBox.Text = $"{{{originX.GetValue(ParamsObject)}, {originY.GetValue(ParamsObject)}}}"; }
private void Delete() { if (treeView.SelectedNode == null) { return; } if (MessageBox.Show($"Вы хотите удалить {(treeView.SelectedNode.Tag is ITechProcess ? "техпроцесс" : "операцию")} '{treeView.SelectedNode.Text}'?", "Подтверждение", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes) { switch (treeView.SelectedNode.Tag) { case ITechProcess techProcess: _camDocument.DeleteTechProcess(techProcess); _currentTechProcessType = null; break; case TechOperation techOperation: _camDocument.DeleteTechOperation(CurrentTechProcess, treeView.SelectedNode.Index); break; } Acad.UnhighlightAll(); ClearParamsViews(); tabControl.SelectedTab = tabPageParams; treeView.SelectedNode.Remove(); treeView.Focus(); RefreshToolButtonsState(); } }
public static void SelectObjectIds(params ObjectId[] objectIds) { if (objectIds == null) { objectIds = Array.Empty <ObjectId>(); } App.LockAndExecute(() => { try { if (_highlightedObjects.Any()) { Interaction.UnhighlightObjects(_highlightedObjects); } if (objectIds.Any()) { Interaction.HighlightObjects(objectIds); } } catch (Exception ex) { Acad.Write($"Error Acad.SelectObjectIds: {ex.Message}"); } _highlightedObjects = objectIds; }); Editor.Regen();// UpdateScreen(); }
private void ImpliedSelectionChanged(object sender, EventArgs e) { if (Acad.GetToolpathObjectId() is ObjectId id) { _camPaletteSet.SelectProcessCommand(id); } }
public void Initialize() { Acad.Write($"Инициализация плагина. Версия сборки от {File.GetLastWriteTime(Assembly.GetExecutingAssembly().Location)}"); _techProcessFactory = new TechProcessFactory(); _camPaletteSet = new CamPaletteSet(); //var manager = new CamManager(); //PaletteSet paletteSet = new PaletteSet("Технология") //{ // Style = PaletteSetStyles.NameEditable | PaletteSetStyles.ShowPropertiesMenu | PaletteSetStyles.ShowAutoHideButton | PaletteSetStyles.ShowCloseButton, // MinimumSize = new Size(300, 200), // KeepFocus = true, // Visible = true //}; //paletteSet.Add("Объекты", new TechProcessView(manager)); //var programView = new ProgramView(manager); //var programmPalette = paletteSet.Add("Программа", programView); //paletteSet.PaletteActivated += (sender, args) => //{ // if (args.Activated.Name == "Программа") // programView.SetProgram(manager.GetProgramm()); //}; Application.DocumentManager.DocumentActivated += (sender, args) => SetActiveDocument(args.Document); SetActiveDocument(Acad.ActiveDocument); //PaletteSet focus use Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView(); //AutocadUtils.AddPaletteSet("Настройки", SettingForm); //machine.ChangeActionsCount += (sender, args) => ObjectForm.ShowProgress(String.Format("Генерация обработки... {0} строк", args.Data)); }
/// <summary> /// Загрузить данные из файла в контейнер /// </summary> /// <returns></returns> public static Settings Load() { try { var formatter = new XmlSerializer(typeof(Settings)); using (var fileStream = new FileStream(GetFilePath, FileMode.Open)) return((Settings)formatter.Deserialize(fileStream)); } catch (Exception e) { Acad.Alert($"Ошибка при загрузке настроек из файла {GetFilePath}", e); throw; //settings = new Settings //{ // //Tools = new List<Tool>(), // //TechProcessParams = new TechProcessParams(), // SawingLineTechOperationParams = new SawingTechOperationParams(), // SawingCurveTechOperationParams = new SawingTechOperationParams() //}; } //if (!settings.MachineSettingsList.Any()) //{ // settings.MachineSettingsList = new List<MachineSettings>() // { // new MachineSettings{ MachineType = MachineType.ScemaLogic, Tools = new List<Tool>(), MaxFrequency = 3000, ZSafety = 20 }, // new MachineSettings{ MachineType = MachineType.Donatoni, Tools = new List<Tool>(), MaxFrequency = 5000, ZSafety = 20 }, // new MachineSettings{ MachineType = MachineType.Krea, Tools = new List<Tool>(), MaxFrequency = 10000, ZSafety = 20 } // }; //} //if (settings.TactileTechProcessParams == null) //{ // settings.TactileTechProcessParams = Tactile.TactileTechProcessParams.GetDefault(); //} //return settings; }
public void SendProgram(ITechProcess techProcess) { if (techProcess.ProcessCommands == null) { Acad.Alert("Программа не сформирована"); return; } var fileName = Acad.SaveFileDialog(techProcess.Caption, Settings.GetMachineSettings(techProcess.MachineType.Value).ProgramFileExtension, techProcess.MachineType.ToString()); if (fileName != null) { try { var contents = techProcess.ProcessCommands.Select(p => p.GetProgrammLine(Settings.GetMachineSettings(techProcess.MachineType.Value).ProgramLineNumberFormat)).ToArray(); File.WriteAllLines(fileName, contents); Acad.Write($"Создан файл {fileName}"); if (techProcess.MachineType == MachineType.CableSawing) { CreateImitationProgramm(contents, fileName); } } catch (Exception ex) { Acad.Alert($"Ошибка при записи файла {fileName}", ex); } } }
private void bRemove_Click(object sender, EventArgs e) { if (treeView.SelectedNode == null) { return; } if (MessageBox.Show($"Вы хотите удалить {(treeView.SelectedNode.Tag is ITechProcess ? "техпроцесс" : "операцию")} '{treeView.SelectedNode.Text}'?", "Подтверждение", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes) { switch (treeView.SelectedNode.Tag) { case ITechProcess techProcess: _camDocument.DeleteTechProcess(techProcess); break; case TechOperationBase techOperation: _camDocument.DeleteTechOperation(techOperation); break; } Acad.SelectObjectIds(); ClearParamsViews(); treeView.SelectedNode.Remove(); RefreshToolButtonsState(); } }
public static void LoadAcadProps(object @object) { bool err = false; var properties = @object.GetType().GetProperties(); foreach (var prop in properties.Where(p => p.PropertyType == typeof(AcadObject))) { var acadObject = (AcadObject)prop.GetValue(@object); if (acadObject != null && !acadObject.LoadObject()) { prop.SetValue(@object, null); err = true; } } foreach (var prop in properties.Where(p => p.PropertyType == typeof(List <AcadObject>))) { var acadObjects = (List <AcadObject>)prop.GetValue(@object); if (acadObjects != null && !acadObjects.All(p => p.LoadObject())) { prop.SetValue(@object, null); err = true; } } if (err) { Acad.Alert("Используемые в техпроцессе объекты чертежа были удалены"); } }
public static bool Validate(Tool tool, ToolType toolType) { string message = null; if (tool == null) { message = "Выберите инструмент"; } else if (tool.Type != toolType) { message = $"Выберите инструмент типа {toolType.GetDescription()}"; } else { if (tool.Type == ToolType.Disk) { if (tool.Diameter == 0) { message = $"Не указан диаметр инструмента"; } if (tool.Thickness.GetValueOrDefault() == 0) { message = $"Не указана толщина инструмента"; } } } if (message != null) { Acad.Alert(message); } return(message == null); }
public static void SaveTechProsess(CamDocument camDocument) { if (camDocument.Hash == 0 && !camDocument.TechProcessList.Any()) { return; } try { const int kMaxChunkSize = 127; using (var resultBuffer = new ResultBuffer()) { using (MemoryStream stream = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, camDocument.TechProcessList); stream.Position = 0; for (int i = 0; i < stream.Length; i += kMaxChunkSize) { int length = (int)Math.Min(stream.Length - i, kMaxChunkSize); byte[] datachunk = new byte[length]; stream.Read(datachunk, 0, length); resultBuffer.Add(new TypedValue((int)DxfCode.Text, Convert.ToBase64String(datachunk))); } } var newHash = resultBuffer.ToString().GetHashCode(); if (newHash == camDocument.Hash) { return; } using (DocumentLock acLckDoc = Acad.ActiveDocument.LockDocument()) using (Transaction tr = Acad.Database.TransactionManager.StartTransaction()) using (DBDictionary dict = tr.GetObject(Acad.Database.NamedObjectsDictionaryId, OpenMode.ForWrite) as DBDictionary) { if (dict.Contains(DataKey)) { using (var xrec = tr.GetObject(dict.GetAt(DataKey), OpenMode.ForWrite) as Xrecord) xrec.Data = resultBuffer; } else { using (var xrec = new Xrecord { Data = resultBuffer }) { dict.SetAt(DataKey, xrec); tr.AddNewlyCreatedDBObject(xrec, true); //xrec.ObjectClosed += new ObjectClosedEventHandler(OnDataModified); } } tr.Commit(); } } } catch (Exception e) { Acad.Alert($"Ошибка при сохранении техпроцессов", e); } }
public void SelectProcessCommand(ITechProcess techProcess, ProcessCommand processCommand) { if (processCommand.ToolpathObjectId.HasValue) { Acad.SelectObjectIds(processCommand.ToolpathObjectId.Value); } Acad.RegenToolObject(techProcess.Tool, processCommand.HasTool, processCommand.ToolLocation, techProcess.MachineType == MachineType.Donatoni); //Settongs.IsFrontPlaneZero }
public static bool CheckNotNull(this object value, string field) { if (value == null) { Acad.Alert($"Не заполнено поле {field}"); } return(value != null); }
public static string GetDesc(this ObjectId id) { if (id.IsErased) { Acad.RecoveryObject(id); } return(ObjectPropertyManagerProperties.GetDisplayName(id)); }
public ParamsView AddAcadObject(string paramName = "ProcessingArea", string displayName = null, string message = "Выбор объектов", string allowedTypes = "*", Action <ObjectId[]> afterSelect = null) { var prop = _type.GetProperty(paramName); var selector = CreateSelector(displayName ?? GetDisplayName(paramName), "۞"); var textBox = selector.Controls[0]; BindingSource.DataSourceChanged += prop.PropertyType == typeof(AcadObject) ? new EventHandler((s, e) => textBox.Text = ((AcadObject)prop.GetValue(ParamsObject))?.GetDesc()) : new EventHandler((s, e) => textBox.Text = ((List <AcadObject>)prop.GetValue(ParamsObject))?.GetDesc()); textBox.Enter += prop.PropertyType == typeof(AcadObject) ? new EventHandler((s, e) => { if (prop.GetValue(ParamsObject) is AcadObject acadObj) { Acad.SelectAcadObjects(new List <AcadObject> { acadObj }); } }) : new EventHandler((s, e) => { if (prop.GetValue(ParamsObject) is List <AcadObject> acadObjList) { Acad.SelectAcadObjects(acadObjList); } }); var button = selector.Controls[1]; button.Click += (s, e) => { //textBox.Text = ""; //prop.SetValue(ParamsObject, null); Interaction.SetActiveDocFocus(); Acad.SelectObjectIds(); var ids = Interaction.GetSelection($"\n{message}", allowedTypes); if (ids.Length == 0) { return; } if (prop.PropertyType == typeof(AcadObject)) { var acadObject = AcadObject.Create(ids[0]); prop.SetValue(ParamsObject, acadObject); textBox.Text = acadObject.GetDesc(); } else { var acadOblects = AcadObject.CreateList(ids); prop.SetValue(ParamsObject, acadOblects); textBox.Text = acadOblects.GetDesc(); } afterSelect?.Invoke(ids); Acad.SelectObjectIds(ids); }; return(this); }
private void Document_CommandWillStart(object sender, CommandEventArgs e) { if (e.GlobalCommandName == "CLOSE" || e.GlobalCommandName == "QUIT" || e.GlobalCommandName == "QSAVE" || e.GlobalCommandName == "SAVEAS") { _documents[sender as Document].TechProcessList.ForEach(p => p.DeleteProcessing()); TechProcessLoader.SaveTechProsess(_documents[sender as Document]); _camPaletteSet.ClearCommands(); Acad.DeleteAll(); } }
public void PartialProcessing(ITechProcess techProcess, ProcessCommand processCommand) { Acad.Write($"Выполняется формирование программы обработки по техпроцессу {techProcess.Caption} с команды номер {processCommand.Number}"); var toolpathObjectIds = techProcess.ToolpathObjectIds.ToList(); techProcess.SkipProcessing(processCommand); Acad.DeleteObjects(toolpathObjectIds.Except(techProcess.ToolpathObjectIds)); Acad.Editor.UpdateScreen(); }
private void processCommandBindingSource_CurrentChanged(object sender, EventArgs e) { if (CurrentProcessCommand != null) { if (CurrentProcessCommand.ToolpathObjectId.HasValue) { Acad.Show(CurrentProcessCommand.ToolpathObjectId.Value); Acad.SelectObjectIds(CurrentProcessCommand.ToolpathObjectId.Value); } Acad.RegenToolObject(CurrentTechProcess.Tool, CurrentProcessCommand.HasTool, CurrentProcessCommand.ToolLocation, CurrentTechProcess.MachineType == MachineType.Donatoni); //Settongs.IsFrontPlaneZero } }
private static void LoadTools(object senser, EventArgs eventArgs) { string path = @"\\192.168.1.59\ssd\_CUST\Utensili.csv"; if (!File.Exists(path)) { Acad.Alert($"Не найден файл инструментов по адресу {path}"); return; } var lines = File.ReadAllLines(path) .Select(p => Array.ConvertAll(p.Split(';'), k => new { result = double.TryParse(k, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var value), value }))
public void SetActiveDocument(Document document) { if (document != null && !_documents.ContainsKey(document)) { document.CommandWillStart += Document_CommandWillStart; document.BeginDocumentClose += Document_BeginDocumentClose; document.ImpliedSelectionChanged += ImpliedSelectionChanged; _documents[document] = new CamDocument(_techProcessFactory); TechProcessLoader.LoadTechProsess(_documents[document]); } Acad.ClearHighlighted(); _camPaletteSet.SetCamDocument(document != null ? _documents[document] : null); }
private void bPlay_Click(object sender, EventArgs e) { toolStrip.Enabled = false; Acad.CreateProgressor("Проигрывание обработки"); Acad.SetLimitProgressor(processCommandBindingSource.Count - processCommandBindingSource.Position); while (processCommandBindingSource.Position < processCommandBindingSource.Count - 1 && Acad.ReportProgressor(false)) { processCommandBindingSource.MoveNext(); System.Threading.Thread.Sleep((int)((ProcessCommand)processCommandBindingSource.Current).Duration * 10); } Acad.CloseProgressor(); toolStrip.Enabled = true; }
public void SelectTechOperation(ITechOperation techOperation) { if (techOperation.ProcessingArea != null) { Acad.SelectObjectIds(techOperation.ProcessingArea.ObjectId); } techOperation.TechProcess.TechOperations.ForEach(p => p.SetToolpathVisible(p == techOperation)); if (techOperation.ProcessCommands == null) { Acad.DeleteToolObject(); } Acad.Editor.UpdateScreen(); }
private void treeView_AfterSelect(object sender, TreeViewEventArgs e) { if (CurrentTechProcess.GetType() != _currentTechProcessType) { _currentTechProcessType = CurrentTechProcess.GetType(); bCreateTechOperation.DropDownItems.Clear(); if (_techOperationItems.ContainsKey(_currentTechProcessType)) { bCreateTechOperation.DropDownItems.AddRange( new List <ToolStripItem> { new ToolStripMenuItem("Все операции", null, new EventHandler(bCreateTechOperation_Click)), new ToolStripSeparator() } .Concat(_techOperationItems[CurrentTechProcess.GetType()]).ToArray()); } RefreshToolButtonsState(); } RefreshParamsView(); if (IsToolpathVisible) { if (treeView.SelectedNode.Tag is TechOperation oper) { CurrentTechProcess.GetToolpathObjectsGroup()?.SetGroupVisibility(false); oper.ToolpathObjectsGroup?.SetGroupVisibility(true); } else { CurrentTechProcess.GetToolpathObjectsGroup()?.SetGroupVisibility(true); } Acad.Editor.UpdateScreen(); } processCommandBindingSource.DataSource = CurrentTechProcess.ProcessCommands; if (treeView.SelectedNode.Tag is TechOperation techOperation) { if (techOperation.ProcessingArea != null) { Acad.SelectObjectIds(techOperation.ProcessingArea.ObjectId); } if (techOperation.ProcessCommandIndex != null) { processCommandBindingSource.Position = techOperation.ProcessCommandIndex.Value; } } else { processCommandBindingSource.Position = 0; } }
/// <summary> /// Сохранить данные в файл /// </summary> public static void Save() { var formatter = new XmlSerializer(typeof(Settings)); try { using (var fileStream = new FileStream(GetFilePath, FileMode.Create)) formatter.Serialize(fileStream, Instance); } catch (Exception e) { Acad.Alert($"Ошибка при сохранении настроек в файл {GetFilePath}", e); } }
public void BuildProcessing(ITechProcess techProcess) { if (!techProcess.TechOperations.Any()) { techProcess.CreateTechOperations(); } if (!techProcess.Validate() || techProcess.TechOperations.Any(p => p.Enabled && p.CanProcess && !p.Validate())) { return; } try { Acad.Write($"Выполняется расчет обработки по техпроцессу {techProcess.Caption} ..."); var stopwatch = Stopwatch.StartNew(); Acad.CreateProgressor($"Расчет обработки по техпроцессу \"{techProcess.Caption}\""); DeleteProcessing(techProcess); Acad.Editor.UpdateScreen(); techProcess.BuildProcessing(); stopwatch.Stop(); Acad.Write($"Расчет обработки завершен {stopwatch.Elapsed}"); } catch (Autodesk.AutoCAD.Runtime.Exception ex) { techProcess.DeleteProcessCommands(); if (ex.ErrorStatus == Autodesk.AutoCAD.Runtime.ErrorStatus.UserBreak) { Acad.Write("Расчет прерван"); } else { Acad.Alert("Ошибка при выполнении расчета", ex); } } catch (Exception ex) { techProcess.DeleteProcessCommands(); Acad.Alert("Ошибка при выполнении расчета", ex); } Acad.CloseProgressor(); Acad.Editor.UpdateScreen(); }
public ProcessCommand Play(ITechProcess techProcess, int commandIndex) { var commands = techProcess.ProcessCommands.Skip(commandIndex).ToList(); var progressor = new Progressor("Проигрывание обработки", commands.Count); foreach (var command in commands) { Acad.RegenToolObject(techProcess.Tool, command.HasTool, command.ToolLocation, techProcess.MachineType == MachineType.Donatoni); if (!progressor.Progress(false)) { SelectProcessCommand(techProcess, command); return(command); } System.Threading.Thread.Sleep(30); } progressor.Stop(); return(commands.First()); }
public void SendProgram(List <ProcessCommand> processCommands, ITechProcess techProcess) { if (processCommands == null || !processCommands.Any()) { Acad.Alert("Программа не сформирована"); return; } var fileName = Acad.SaveFileDialog(techProcess.Caption, _machineSettings[techProcess.MachineType.Value].ProgramFileExtension, techProcess.MachineType.ToString()); if (fileName != null) { try { var contents = processCommands?.Select(p => p.GetProgrammLine(_machineSettings[techProcess.MachineType.Value].ProgramLineNumberFormat)).ToArray(); File.WriteAllLines(fileName, contents); Acad.Write($"Создан файл {fileName}"); } catch (Exception ex) { Acad.Alert($"Ошибка при записи файла {fileName}", ex); } } }
/// <summary> /// Загрузить технологические процессы из файла чертежа /// </summary> public static void LoadTechProsess(CamDocument camDocument) { try { using (Transaction tr = Acad.Database.TransactionManager.StartTransaction()) using (DBDictionary dict = tr.GetObject(Acad.Database.NamedObjectsDictionaryId, OpenMode.ForRead) as DBDictionary) if (dict.Contains(DataKey)) { using (Xrecord xRecord = tr.GetObject(dict.GetAt(DataKey), OpenMode.ForRead) as Xrecord) using (ResultBuffer resultBuffer = xRecord.Data) using (MemoryStream stream = new MemoryStream()) { camDocument.Hash = resultBuffer.ToString().GetHashCode(); foreach (var typedValue in resultBuffer) { var datachunk = Convert.FromBase64String((string)typedValue.Value); stream.Write(datachunk, 0, datachunk.Length); } stream.Position = 0; var formatter = new BinaryFormatter { Binder = new MyBinder() }; camDocument.TechProcessList = (List <ITechProcess>)formatter.Deserialize(stream); } } if (camDocument.TechProcessList != null) { camDocument.TechProcessList.ForEach(p => p.Setup()); Acad.Write($"Загружены техпроцессы: {string.Join(", ", camDocument.TechProcessList.Select(p => p.Caption))}"); } } catch (Exception e) { Acad.Alert($"Ошибка при загрузке техпроцессов", e); } }
private void CreateImitationProgramm(string[] contents, string fileName) { List <string> result = new List <string>(contents.Length * 2); foreach (var item in contents) { if (item.StartsWith("M03")) { continue; } var line = item.Replace("G01", "G00"); var vi = line.IndexOf('V'); if (vi > 0) { line = line.Substring(0, vi) + "V0"; } if (line == "G00 U0 V0") { continue; } result.Add(line); if (line.StartsWith("G00")) { result.Add("M00"); } } var parts = fileName.Split('.'); fileName = parts[0] + "_i." + parts[1]; File.WriteAllLines(fileName, result); Acad.Write($"Создан файл с имитацией {fileName}"); }