создание точек при помощи пользователя, затем создание окружности на точке!help!

Автор Тема: создание точек при помощи пользователя, затем создание окружности на точке!help!  (Прочитано 38184 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Здравствуйте! Понимаю что вопрос глупый, но всё же прошу помощи.
Не могу найти нужной информации в интернете. решил обратиться за помощью к вам на форум.
язык : C# , среда : MVS13, autocad 14.
Задача проста:
При вызове функции дать пользователю создать точку на ней сделать окружность и заштриховать в solid.
рядом создать label с текстом, и получить данные на этот label чтобы к нему можно было программно обратиться.

p.s. создание точки не обязательно можно просто создать окружность заштриховать и выполнить перемещение этих объектов, чтобы пользователь сам выбирал куда его переместить.

Заранее прошу не ругайте, autocad api мне не понятен:

Подключены библиотеки:
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Windows;
using Autodesk.Windows;

наследование :
 public class Class1 : IExtensionApplication
создана команда вызова функции:       
[CommandMethod("func_form")]
        public void func_form()
        {
-----------------------------------------------------
вызывается функция в которой и надо всё осуществить:
Код - C# [Выбрать]
  1.  static public String func_new_circle(int f_id)
  2.         {
  3.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  4.             Database acDocBase = acDoc.Database;
  5.             using (DocumentLock acDocLock = acDoc.LockDocument())
  6.             {
  7.                 using (Transaction acDocTr = acDocBase.TransactionManager.StartTransaction())
  8.                 {
  9.  
  10.                 }
  11.             }
  12.  
  13.             return "нужно возвратить id label";
  14.         }
  15.  

Заранее Большое спасибо, каждому кто попытается помочь!

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
autocad 14
autocad 14 и autocad 2014 - четыре совершенно разных человека.

При вызове функции дать пользователю создать точку на ней
на функции?
Заранее прошу не ругайте, autocad api мне не понятен
Понятие может появиться здесь.
наследование :
 public class Class1 : IExtensionApplication
создана команда вызова функции:       
[CommandMethod("func_form")]
        public void func_form()
        {
Интерфейс IExtensionApplication не имеет никакого отношения к определению команд. В документации всё достаточно понятно разжёвано.

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
autocad 14
autocad 14 и autocad 2014 - четыре совершенно разных человека.

При вызове функции дать пользователю создать точку на ней
на функции?
Заранее прошу не ругайте, autocad api мне не понятен
Понятие может появиться здесь.
наследование :
 public class Class1 : IExtensionApplication
создана команда вызова функции:       
[CommandMethod("func_form")]
        public void func_form()
        {
Интерфейс IExtensionApplication не имеет никакого отношения к определению команд. В документации всё достаточно понятно разжёвано.
- autocad 2014 x64
- на чертеже
- за это спасибо большое
- вычитал в интернете что нужно наследовать



Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
При вызове функции дать пользователю создать точку на ней сделать окружность и заштриховать в solid.
рядом создать label с текстом, и получить данные на этот label чтобы к нему можно было программно обратиться.
Тут, по моему, Вам надо сначала пояснить вызов какой функции имеется в виду. Если это команда автокада - то она обычно ничего не возращает (хоть и может) - а например выводит на экран пользователю. Если это лисп функция - то она уже может вернуть id объекта завернутый в соответствующее лисп представление - которое сможет обработать лисп программа. Или имеется в виду функция на C# которая может вернуть как созданный объект, так, например и его id - в случае добавления его в БД рисунка. А лучше распишите задачу более полно - простыми словами - на уровне пользователя и поясните в какой части реализации у Вас сложности.

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
При вызове функции дать пользователю создать точку на ней сделать окружность и заштриховать в solid.
рядом создать label с текстом, и получить данные на этот label чтобы к нему можно было программно обратиться.
Тут, по моему, Вам надо сначала пояснить вызов какой функции имеется в виду. Если это команда автокада - то она обычно ничего не возращает (хоть и может) - а например выводит на экран пользователю. Если это лисп функция - то она уже может вернуть id объекта завернутый в соответствующее лисп представление - которое сможет обработать лисп программа. Или имеется в виду функция на C# которая может вернуть как созданный объект, так, например и его id - в случае добавления его в БД рисунка. А лучше распишите задачу более полно - простыми словами - на уровне пользователя и поясните в какой части реализации у Вас сложности.
Хорошо, попробую так:

Задача:
считать данные с файла, (name, h)
дать пользователю выбрать на чертеже место расположение окружности,
добавить label , записать в отдельный файл x, y, z центра окружности, что то при помощи чего можно в будущем программно отредактировать label.
всё.
имеется класс и форма:
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using Autodesk.AutoCAD.Runtime;
  8. using Autodesk.AutoCAD.Geometry;
  9. using Autodesk.AutoCAD.DatabaseServices;
  10. using Autodesk.AutoCAD.Windows;
  11. using Autodesk.Windows;
  12.  
  13.  
  14. namespace proekt1
  15. {
  16.     public class Class1 : IExtensionApplication
  17.     {
  18.         static public FRM_GENERAL form1_gener;
  19.         public void Initialize()
  20.         {
  21.         }
  22.         public void Terminate()
  23.         {
  24.  
  25.         }
  26.         [CommandMethod("func_form")]
  27.         public void func_form()
  28.         {
  29.             form1_gener = new FRM_GENERAL();
  30.             form1_gener.Show();
  31.         }
  32.         static public void func_rename_new(string f_new_layers)
  33.         {
  34.                        
  35.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  36.             Database acDocBase = acDoc.Database;
  37.             using (DocumentLock acDocLock = acDoc.LockDocument())
  38.             {
  39.                 using (Transaction acDocTr = acDocBase.TransactionManager.StartTransaction())
  40.                 {
  41.                     LayerTable acDocLayerTable = acDocTr.GetObject(acDocBase.LayerTableId, OpenMode.ForWrite) as LayerTable;
  42.                     LayerTableRecord acDocNewLayer = new LayerTableRecord();
  43.                     acDocNewLayer.Name = f_new_layers;
  44.                     acDocLayerTable.Add(acDocNewLayer);
  45.                     acDocTr.AddNewlyCreatedDBObject(acDocNewLayer, true);
  46.                     acDocBase.Clayer = acDocLayerTable[f_new_layers];
  47.                     acDocTr.Commit();
  48.                 }
  49.             }
  50.             form1_gener.Show();
  51.             return;
  52.         }
  53.         static public String func_new_circle(int f_id)
  54.         {
  55.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  56.             Database acDocBase = acDoc.Database;
  57.             using (DocumentLock acDocLock = acDoc.LockDocument())
  58.             {
  59.                 using (Transaction acDocTr = acDocBase.TransactionManager.StartTransaction())
  60.                 {
  61.  
  62.                 }
  63.             }
  64.  
  65.             return "sda";
  66.         }
  67.     }
  68. }
  69.  
  70.  
Код - C# [Выбрать]
  1. using System;
  2. using System.IO;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Windows.Forms;
  10.  
  11.  
  12. namespace proekt1
  13. {
  14.     public partial class FRM_GENERAL : Form
  15.     {
  16.         public int[] ptk_id;
  17.         public string[] ptk_name;
  18.         public double[] ptk_h;
  19.         public double[] ptk_x;
  20.         public double[] ptk_y;
  21.         public FRM_GENERAL()
  22.         {
  23.             InitializeComponent();
  24.         }
  25.  
  26.         private void FRM_GENERAL_Load(object sender, EventArgs e)
  27.         {
  28.             this.Text = "";
  29.             button1.Text = "0 цикл";
  30.             button1.Size = new Size(210, 20);
  31.             button1.Tag = "1";
  32.             button1.Click += new EventHandler(fnc_btn1);
  33.         }
  34.         public void fnc_btn1(object sender, EventArgs e)
  35.         {
  36.             openFileDialog1.Filter = "txt files (*.txt) |*.txt";
  37.             openFileDialog1.ShowDialog();
  38.             if (openFileDialog1.FileName == null)
  39.             {
  40.                 return;
  41.             }
  42.             FileStream fl1_pth = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
  43.             StreamReader fl1_reader = new StreamReader(fl1_pth);
  44.             String txt_read_f1 = fl1_reader.ReadToEnd();
  45.             fl1_reader.Close();
  46.             String[] txt_mas_f1 = txt_read_f1.Split(new Char[]{ '\t', '\n' });
  47.             int i = 1;
  48.             int ii = 0;
  49.             int length_mas = txt_mas_f1.Length / 2;
  50.             ptk_id = new int[length_mas];
  51.             ptk_name = new string[length_mas];
  52.             ptk_h = new double[length_mas];
  53.             ptk_x = new double[length_mas];
  54.             ptk_y = new double[length_mas];
  55.             Char separator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator[0];
  56.             Class1.func_rename_new("осадочные марки");
  57.             foreach (String vr in txt_mas_f1)
  58.             {
  59.                 if (i % 2 == 1)
  60.                 {
  61.                     textBox1.Text += Environment.NewLine;
  62.                     ptk_id[ii] = ii;
  63.                     ptk_name[ii] = vr;
  64.                 }else{
  65.                     string aaa = vr.Replace(',', separator);
  66.                     ptk_h[ii] = Convert.ToDouble(aaa);
  67.                     textBox1.Text += Environment.NewLine;
  68.                     textBox1.Text += "id : " + ptk_id[ii] + " name : " + ptk_name[ii] + " h : " + ptk_h[ii];
  69.                     textBox1.Text += Class1.func_new_circle(1);
  70.                     ii++;
  71.                 }
  72.                 i++;
  73.             }
  74.         }
  75.     }
  76. }
  77.  
  78.  

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
данные действия должны выполнится :
Код - C# [Выбрать]
  1.  static public String func_new_circle(int f_id)
  2.         {
  3.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  4.             Database acDocBase = acDoc.Database;
  5.             using (DocumentLock acDocLock = acDoc.LockDocument())
  6.             {
  7.                 using (Transaction acDocTr = acDocBase.TransactionManager.StartTransaction())
  8.                 {
  9.  
  10.                 }
  11.             }
  12.  
  13.             return "sda";
  14.         }
  15.  
из ссылки данной во втором посте, я нашел как создавать объекты с известными координатами на чертеже, но пока ещё не понимаю как дать пользователю самому выбрать месторасположения объекта.

P.S. не могу найти кнопки спасибо на вашем форуме :(

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
И у меня сразу 2 вопроса по Вашему описанию - а как Вы предполагаете связать окружность с "label" - способов много - но Вы по моему об этом пока еще не подумали; а если пользователь подвинет окружность, или будут 2 с одним центром?
з.ы. не бросайтесь сразу на реализацию кода - вначале конкретизируйте, хотя-бы для себя, задачу детально.
Цитировать
как дать пользователю самому выбрать месторасположения объекта.
см. функции GetXXX в классе Document.Editor
XXX - так как я не понял, надо дать пользователю выбрать точку или уже существующий объект (GetPoint или GetEntity)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Приветствую на форуме!
P.S. не могу найти кнопки спасибо на вашем форуме :(


Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
добавить label
В AutoCAD'е такого примитива нет. Есть однострочный текст (DBText), есть мельтитекст (MText), есть атрибуты блока, есть выноски. Так что определись с этим.
Кстати, судя по тому что ты описал, тебе больше всего подходит блок, содержащий окружность и атрибут, который ты назвал label. В этом случае тебе не придётся по окружности искать label, т.к. они будут в одном примитиве.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Приветствую на форуме!
Цитата: zmk.autocad от 19-04-2015, 22:26:53
P.S. не могу найти кнопки спасибо на вашем форуме

Это не "спасибо", это "плюсик".  :D Настоящая кнопочка "спасибо" находится здесь:D

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Приветствую на форуме!
P.S. не могу найти кнопки спасибо на вашем форуме :(



кнопок изменений репутации у меня нет. Наверное мой ранг не позволяет пока что.

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
И у меня сразу 2 вопроса по Вашему описанию - а как Вы предполагаете связать окружность с "label" - способов много - но Вы по моему об этом пока еще не подумали; а если пользователь подвинет окружность, или будут 2 с одним центром?
з.ы. не бросайтесь сразу на реализацию кода - вначале конкретизируйте, хотя-бы для себя, задачу детально.
Цитировать
как дать пользователю самому выбрать месторасположения объекта.
см. функции GetXXX в классе Document.Editor
XXX - так как я не понял, надо дать пользователю выбрать точку или уже существующий объект (GetPoint или GetEntity)
вот пример размещения textbox multiline


Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
вот пример размещения textbox multiline
Тут можно глянуть пару мультиков с похожими "текстбоксами". Исходный код, ежели что, выложен там же.

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
textbox не надо привязывать к окружности. Просто надо что бы его можно было в дальнейшем отредактировать. т.е. как я понимаю его имя или id из базы autocad`a.

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
вот пример размещения textbox multiline
Тут можно глянуть пару мультиков с похожими "текстбоксами". Исходный код, ежели что, выложен там же.
Большое спасибо! скорее всего это то что нужно!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
textbox multiline
Давай с терминами почетче. В AutoCAD'е multiline (мультилиния) - это такой примитив чертежа, а textbox - это lisp-функция позволяющая получить габаритные точки текста (читай документацию).
Поэтому то, что ты написал - это полная бессмыслица. На картинке же у тебя вообще-то я вижу жирный кружок, который можно сделать командой _DONUT (или нарисовать полилинией с толщиной), и рядом текст в виде дроби, который можно делать различными способами.
Остаюсь при своём мнении, что это лучше делать блоком с атрибутом/атрибутами.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Немного все ровно не догоняю. понимаю как пользователю предоставить выбор обекта или точки. Понимаю как создать объект.
Но не могу понять как выбрать нужный объект и выполнить метод перемещения.
Помогите кому кому не сложно.

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Человек изобретает COGO-точки, не мешайте  ;D

я не изобретаю, я пытаюсь автоматизировать себе работу.
я начал с простейшей задачи, заодно облегчу себе работу + пойму азы api autocad`a.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Но не могу понять как выбрать нужный объект и выполнить метод перемещения.
1) Что такое "нужный объект"? По каким критериям ты можешь определить, что это именно тот объект который нужен?
2) Если ты знаешь ObjectId или Handle "нужного объекта", то переместить его очень просто. Куда перемещать ты решаешь сам или нужно спросить у пользователя?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Но не могу понять как выбрать нужный объект и выполнить метод перемещения.
1) Что такое "нужный объект"? По каким критериям ты можешь определить, что это именно тот объект который нужен?
2) Если ты знаешь ObjectId или Handle "нужного объекта", то переместить его очень просто. Куда перемещать ты решаешь сам или нужно спросить у пользователя?
Спасибо за отзыв. создал объект. и к нему нужно обратиться и перевести как бы в режим перемещения, что бы пользователь  водил мышкой и к ней привязан объект и при клике перемещение завершалось.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
и перевести как бы в режим перемещения, что бы пользователь  водил мышкой и к ней привязан объект и при клике перемещение завершалось.
Это API в AutoCAD называется JIG (пара базовых классов DrawJig и EntityJig).
Один из примеров: http://adndevblog.typepad.com/autocad/2012/07/how-to-show-a-block-when-positioning-it-using-c.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
и перевести как бы в режим перемещения, что бы пользователь  водил мышкой и к ней привязан объект и при клике перемещение завершалось.
Это API в AutoCAD называется JIG (пара базовых классов DrawJig и EntityJig).
Один из примеров: http://adndevblog.typepad.com/autocad/2012/07/how-to-show-a-block-when-positioning-it-using-c.html

Спасибо большое.
Это получается мне обязательно нужно создавать именованный блок, и уже с ним делать перемещения? а нельзя ли просто обратиться к объекту MText?

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
а нельзя ли просто обратиться к объекту MText?
Можно - Вам уже писали EntityJig. Торопитесь Вы - "нахрапом" с "этим автокадом" редко у кого (а по моему ни у кого) не получалось.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
а нельзя ли просто обратиться к объекту MText?
Вообще-то я давал пример использования DrawJig, а не готовое решение. Можно по аналогии сделать и для MText. Только потом ты будешь искать какой MText относится к какому кружочку.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Правило N1 програмирования под Автокад - не изобретать велосипед! Прежде чем начинать програмировать - проверить не реализована ли даная задача существующими способами
В данном случае всё уже реализованно в Civil 3D!

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
В данном случае всё уже реализованно в Civil 3D!
Да все уже в курсе, что у тебя Civil 3D - ты повторяешься, "забывая" при этом, что он "не детских" денег стоит.

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
AutoCAD 195 713,29 руб.
Civil 3D 262 996,58 руб.
Цитировать
он "не детских" денег стоит.
67283.29?
34%
"огромные" денги по сравнению с этим

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Народ, заканчивайте флудить!
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Правило N1 програмирования под Автокад - не изобретать велосипед! Прежде чем начинать програмировать - проверить не реализована ли даная задача существующими способами
В данном случае всё уже реализованно в Civil 3D!
Правило N1 на этом форуме - не навязывать своё мнение. Особенно так настойчиво. Одного раза в теме было достаточно указать на возможность использовать Civil 3D. В дальнейшем я буду воспринимать это как offtop и такого рода сообщения в разделах по программированию под AutoCAD будут удаляться.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Не нужен мне civil 3D! Я работаю в автокаде.
Да я не супер программер, изучал c# в студенческие годы, а сейчас решил упростить свою работу интересным для меня способом.

Кто то написал что я буду искать какой текст к какому кружочку относится. Я считаю что не возникнет проблем.
Сейчас опишу суть всей программы.

Имеется исходный файл :
номер точки  высота
b1    173.3234
b2    175.2343
и т.д.
Я считываю его и на каждой точке даю возможность указать себе место расположения её на чертеже.
и подпись номера точки рядом с условным знаком.
далее беру и записываю данные в файл туда пишу имя точки высоту и как я понимаю objectId текста

Всё это проделывается один раз. на чертеже, далее поступают два раза в месяц исходные данные такого же формата на протяжении года, я собираюсь подгрузить этот файл и файл который был записан в первом случаи. взять разность этих высот и вписать в текст , как я понимаю по сохраненному objectid я получу доступ к тексту.

вот в общем примерно такая задача стоит.

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
На данном этапе я временно отложил удобное расположение текста, и написал на сохранения файла код
в итоге у меня получился такой текстовый файл:
0   m1   1231285   (8796087803088)
1   m2   1251586   (8796087803152)
2   m3   1267456   (8796087803200)
3   m4   1277896   (8796087803248)
исчезли запятые после конвертации в строку данных и objectId прописывается в скобках.
Я понимаю что всех уже задолбал, но все же кто может подсказать как получить доступ к объекту зная его Id?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
1) ObjectId не сохраняется между сессиями AutoCAD, т.е. при следующем запуске AutoCAD для того же самого текста будет другой ObjectId
2) Между сессиями AutoCAD сохраняется Handle. Вот его и можно писать во внешний файл.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Ok спасибо большое, а как потом получить доступ к объекту?

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Получился такой файл
0   �1   1231285   245
1   m2   1251586   249
2   m3   1267456   24C
3   m4   1277896   24F

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Ok спасибо большое, а как потом получить доступ к объекту?
Насколько я помню, HandleToObject потребуется. Могу ошибаться...
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Насколько я помню, HandleToObject потребуется. Могу ошибаться...
Можешь. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Ok спасибо большое, а как потом получить доступ к объекту?
Насколько я помню, HandleToObject потребуется. Могу ошибаться...
спасибо, буду пробывать -)

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Могу ошибаться...

угу...

Код - C# [Выбрать]
  1. // i is long
  2. Handle h = new Handle(i);
  3. // db is Database, id is ObjectId.
  4. Boolean isValidHandle = db.TryGetObjectId(h, out id);

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вот пример как по метке (Handle) в строчном представлении обратиться к объекту (примитиву): http://through-the-interface.typepad.com/through_the_interface/2007/02/getting_access_.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Вот пример как по метке (Handle) в строчном представлении обратиться к объекту (примитиву): http://through-the-interface.typepad.com/through_the_interface/2007/02/getting_access_.html
Это пример того, как НЕ надо делать. :)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Это пример того, как НЕ надо делать. :)
Если ты про использование Database.GetObjectId вместо Database.TryGetObjectId - то могу согласится.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Если ты про использование Database.GetObjectId вместо Database.TryGetObjectId - то могу согласится.
угу. А что, разве возможны ещё какие-то варианты предположений? )

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Ка я понимаю вы имеете ввиду что нужно обязательно перехватить ошибки?

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
он использовал другой метод но всё же весь код находиться в блоке try. Это хуже чем TryGetObjectId ?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Это хуже чем TryGetObjectId ?
Здесь сравни время, затраченное на обработку одного и того же объёма работы. Сравнивай значения в колонках DBSearcher_TryCatch и DbBrowser. Первая из них использует GetObjectId, а вторая - TryGetObjectId.

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Просто теряем производительность, но если взять такой маленький проект как мой, то факта потери производительности не будет. но дабы не привыкать к плохому сделаю trygetobject

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Просто теряем производительность, но если взять такой маленький проект как мой, то факта потери производительности не будет.
Размеры проекта тут вообще не при чём.

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
05:30,4050567 ? 5 минут? это как так?
там написано, как. тебя ведь только что это не смущало:
Цитата: zmk.autocad
Просто теряем производительность,

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Нет я просто взглянул, и не сразу просек что дело в минутах, я сначала понял как 5 секунд.

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Всё равно я не понимаю процесс редактирование объекта.
Код - C# [Выбрать]
  1. static public void func_edit_text(Double f_h, string f_name, string f_handle)
  2.         {
  3.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  4.             Database acDocBase = acDoc.Database;
  5.             Editor acDocEdit = acDoc.Editor;
  6.             long handle_long  = Convert.ToInt64(f_handle,);
  7.             Handle handle = new Handle(handle_long);
  8.             ObjectId id_obj;
  9.             Boolean isValidHandle = acDocBase.TryGetObjectId(handle,out id_obj);
  10.             using (DocumentLock acDockLock = acDoc.LockDocument())
  11.             {
  12.                 using (Transaction acDocTr = acDoc.TransactionManager.StartTransaction())
  13.                 {
  14.                     DBObject obj = acDocTr.GetObject(id_obj,OpenMode.ForWrite);
  15.                     acDocTr.Commit();
  16.                 }
  17.             }
  18.  
  19.         }

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
я читал руководство https://sites.google.com/site/bushmansnetlaboratory/home , там не все статьи переведены. очень мало инфы в рунете по api autocad.
а что тут не так. задача то стоит простая. отлатчик ошибок я не писал пока, потому что собрался писать после того как разберусь с редактированием объекта.
Хотя бы скажи что тут плохого то?


Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
это не код, это мусор.
Не гоните - код как код.
Автору - далее проверяете что у Вас в obj (можно-ли повысить до mtext? а еще лучше проверить это по ObjectId до открытия транзакции - см. свойство ObjectClass.Name/DxfName) и меняете необходимые свойства у полученного объекта до Commit'а транзакции.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
я читал руководство https://sites.google.com/site/bushmansnetlaboratory/home , там не все статьи переведены. очень мало инфы в рунете по api autocad.
Плохо читал. Информации в интернете полно.
Цитата: zmk.autocad
Хотя бы скажи что тут плохого то?
Плохого тут то, что ты бездумно подставляешь фрагменты кода, не имея понятия о том, как это должно работать. Вот заменил ты GetObjectId на TryGetObjectId и что? Как ты думаешь, для чего в коде я получал логическое значение?
Код - C# [Выбрать]
  1. long handle_long  = Convert.ToInt64(f_handle,);
что это за недосказанность в скобках?
Код - C# [Выбрать]
  1. ObjectId id_obj;
Возьми за правило инициализировать подобные переменные значением ObjectId.Null.
Код - C# [Выбрать]
  1. Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  2.             Database acDocBase = acDoc.Database;
Начиная с AutoCAD 2015 нужно предварительно проверять acDoc на равенство null, иначе если твой код в будущем будет вызван при автоматической загрузке, ты можешь получить исключение.
Код - C# [Выбрать]
  1. long handle_long  = Convert.ToInt64(f_handle,);
Ты уверен, что тебе в качестве значения f_handle не передали "чебурашку"? Читать про Int64.TryParse().

Код - C# [Выбрать]
  1. DBObject obj = acDocTr.GetObject(id_obj,OpenMode.ForWrite);
А ты уверен, что объект, который пытаешься получить по идентификатору, не удалён? Смотри перегруженные варианты метода.
Цитата: Дима_
Не гоните - код как код.
Ещё один, млин...

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Ещё один, млин...
Я тоже могу обос***ть абсолютно любой код, тем паче что половина Ваших замечаний, требуют как минимум предварительных уточнений до критики (проверять в каждой функции "чебурашку" на входе точно не требуется - иначе комп. будет одними проверками занят - если мы точно знаем - то есть уже предварительно проверили входные данные, либо получили их из 100% достоверных источников - это только лишние ресурсы, а проверка document'а на null задавать целесообразно в макросах компиляции - а у автора, насколько я помню разговор шел про 2014 акад) - не забывайте - автору неделя "от роду".

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Плохого тут то, что ты бездумно подставляешь фрагменты кода, не имея понятия о том, как это должно работать. Вот заменил ты GetObjectId на TryGetObjectId и что? Как ты думаешь, для чего в коде я получал логическое значение?
да не спорю, где то не врубаю, но в мануале не догоняю больше. когда пишу, понимание немного приходит.
Получал что бы сделать условие на результат операции. но на данный момент я его не делал потому что хотел сначала разобраться с процессом редактирование.

что это за недосказанность в скобках?
да тут реально не догнал в подсказке написано для сведений о форматировании для определенного языка и региональных настроек.

Возьми за правило инициализировать подобные переменные значением ObjectId.Null.
Да про это читал как то! согласен.

Ты уверен, что тебе в качестве значения f_handle не передали "чебурашку"? Читать про Int64.TryParse().
про tryparse я то же читал. там ставишь разрешенный тип числа и ещё что то, затем переменную куда возвратить результат и сам метод возвращал булево значение результата.

А на самом деле спасибо. Твоя критика мне очень помогает на самом деле!

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Цитировать
Я тоже могу обос***ть абсолютно любой код
Welcome.
Цитировать
тем паче что половина Ваших замечаний, требуют как минимум предварительных уточнений до критики
Ну так... давайте уточним, ежели кому чего не понятно.

проверять в каждой функции "чебурашку" на входе точно не требуется - иначе комп. будет одними проверками занят
Значит Вы умнее Беарне Стровструпа, утверждающего как раз противоположное. В этом случае конечно же, не спорю с Вами.
если мы точно знаем - то есть уже предварительно проверили входные данные, либо получили их из 100% достоверных источников - это только лишние ресурсы
Ну, если Вы "точно знаете", то конечно же можете полагаться на это. Я же предпочитаю перестраховываться - как правило это не подводит.
Цитата: Дима_
а проверка document'а на null задавать целесообразно в макросах компиляции
Поделитесь со мной таким чудесным кодом?
Цитата: Дима_
а у автора, насколько я помню разговор шел про 2014 акад
Сегодня про 2014, а завтра последует вопрос о том, почему не работает в 2015 и 2016. Нужно смотреть хотя бы на шаг вперёд.
Цитата: Дима_
не забывайте - автору неделя "от роду".
Это не отменяет необходимость читать текст по ссылкам, которые даются. Если бы он внимательно почитал материал,  на результаты которого я давал ссылку, а не просто открыл и закрыл, то он знал бы, в чём заключается разница между обозначенными методами и как это используется в коде, т.к. этот код так же присутствовал в том же материале.

На данный момент времени я, к сожалению, вижу, что человек ленится читать и по большей части занимается гаданием.

P.S. Для особо чувствительных уточняю: под "мусором" подразумевалась бездумная замена обозначенного выше метода GetObjectId на TryGetObjectId. Все остальные замечания - это дополнительная информация для размышления.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Андрей Бушман, Дима_, zmk.autocad
А теперь все дружно перешли на нормальный русский язык. И без наездов друг на друга. Андрея, как заводилу, это касается в первую очередь.
И с оффтопом завязывайте.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Да, так пишу программу для себя, и  f_handle это считанный из файла handle объекта, который был записан.
А вообще я почему то хотел все исключения потом написать, если всё будет работать. Так как ещё некоторым коллегам так же не помешала бы эта программа.

Чем она полезна?
имеется 100 точек и их высотка,
через 2 недели приходят те же точки но с немного другой высоткой.
мы открываем exel считаем отклонения от начальной высоты, т.е. их разность . распечатываем. сидит с листком смотрим
м324 ищем точку на чертеже и руками прописываем отклонения.
далее м313 и опять. очень нудная работа, причем пустяковая.
а если этот процесс автоматизировать, то большая экономия времени. можно сделать более серьезные вещи за это время.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
А вообще я почему то хотел все исключения потом написать, если всё будет работать.
Никогда не откладывай на потом - пиши нормально сразу. Практика показывает, что это самое "потом" либо совсем не наступает, либо половина из намеченных на "потом" пунктов забывается.

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
не преобразовывается число в 16  систему счисления -)
его история :
FP_result = acMText.Handle.ToString();
затем сохранен и считан из файла
теперь
handle_long = Convert.ToInt64(f_handle, 16);
выдает ошибку.
может из-за кодировки, хотя я не менял её, значит unicod

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Сохранять в строку 10-тичное представление и затем, читая его обратно, пытаться интерпретировать строку уже как 16-тиричное - это, конечно, оригинально. Почитай про форматирование строковых представлений чисел (см. перегруженные версии метода ToString()).
« Последнее редактирование: 22-04-2015, 10:23:28 от Андрей Бушман »

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Я боюсь что думаю не в том направлении.
как это всё должно выглядеть?
берем значение hadle.value и записываем его в переменную типа long
совмещаем с остальными строковыми параметрами методом string.format();
Считываем из файла и получаем : 592
как получается 16 система счисления тут вообще не появлялась.

а если брать hadle.ToString то получаем строковую переменную формата 16-ой системы счисления.


Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
как получается 16 система счисления тут вообще не появлялась.
Запятые расставь корректно, иначе х.з. как тебя понимать. И не ленись пользоваться поиском, не забывая так же про MSDN.

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
получается шестнадцатеричная система счисления тут вообще не появлялась.

а если брать hadle.ToString то получаем строковую переменную формата 16-ой системы счисления.

Суть вопроса:
мне в файл надо записывать hadle.value , которое представляет формат : 592
или hadle.toString, где выходит формат : 53B

и перед записью в файл надо переводить в 16-ричную систему счисления?

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
А почему не использовать блоки с атрибутами? И ключ в атрибутах прописать...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А почему не использовать блоки с атрибутами? И ключ в атрибутах прописать...
А вот об этом я писал еще на первой странице этого обсуждения. Но меня zmk.autocad или не понял, или проигнорировал.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Я не совсем понимаю как это получится. и если в блоке MText и Circle то как я в будущем буду редактировать MText? и в этом случае как я понимаю нельзя будет подвинуть вручную текст, без окружности.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
В AutoCAD'е есть многострочные атрибуты и определения атрибутов (классы MTextAttribute и MTextAttributeDefinition).
Атрибуты блока можно двигать независимо от вставки блока и у каждого атрибута может быть своё, отличное от атрибута другого блока значение.
Учи матчасть. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Ну теперь уже начал так. -(

Вот я не могу понять главного

handle.tosting(); мне выдает 24D
Это что? это как бы уже готовое 16-ричное значение, просто текстовый вариант. т.е. его надо не переводить в 16-ричную систему, а преобразовать тип. так получается?

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
вот без сохранения в файл работает

Код - C# [Выбрать]
  1. FP_result_long = acMText.Handle.Value;
  2.  
  3.                         Handle n_h = new Handle(FP_result_long);
  4.  
  5.                         ObjectId obj_id = ObjectId.Null;
  6.                         Boolean flag_get = acDocBase.TryGetObjectId(n_h, out obj_id);
  7.                         if (flag_get == false)
  8.                         {
  9.                             return "Error3";
  10.                         }
  11.  
  12.                         string obj_class_name = obj_id.ObjectClass.Name;
  13.                         DBObject get_object = acDocTr.GetObject(obj_id, OpenMode.ForWrite, true);
  14.                         MText haha = (MText)get_object;
  15.                         haha.Contents = "ewwe";
  16.                         acDocTr.Commit();
а здесь работа идет не с handle.toString(); , a c handle.value которое имеет тип 582. дак зачем тогда вообще 16-ричная система счисления?

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Всем БОЛЬШОЕ СПАСИБО! Теперь всё работает!
теперь осталось по мелочи доделать!

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
блин как он так считает?
double x1 = 123,1385
double x2 = 123,1285
(x1-x2)*1000 = 9.99999999999091

Онлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
блин как он так считает?
double x1 = 123,1385
double x2 = 123,1285
(x1-x2)*1000 = 9.99999999999091
а Вам так уж нужна точность больше 3, 4 знаков после запятой? Округляйте.

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Я уже округлил, я просто не вкурю как он два числа высчитал так неточно (


Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
а как сделать некотрую часть текста по центру.
Нашел только такие коды форматирования
\O...\o Включает и отключает надчеркивание
\L...\l Включает и отключает подчеркивание
\~ Неразрывный пробел
\\ Обратный слэш (обратная косая черта)
\CЗначение; Меняет значение цвета текста
\FИмя_файла; Устанавливает шрифт на указанный
\HЗначение; Устанавливает высоту текста в единицах чертежа
\HЗначниеx; Устанавливает высоту текста относительно текущей
\SЧислитель/Знаменатель; Формирует двухуровневый текст в виде горизонтальной дроби
\SЧислитель/Знаменатель; Формирует двухуровневый текст в виде "наклонной" дроби
\SВерхний/Нижний; Формирует двухуровневый текст с верхним и/или нижним индексом
\TЗначение; Устанавливает расстояние между символами в тексте. Значение варьируется от 0,75 до 4 относительно стандартного значения
\QУгол; Меняет угол наклона текста
\WКоэффициент; Устанавливает коэффициент ширины символов
\A Задает выравнивание текста: 0 - по низу; 1 - по середине; 2 - по верху строки
\P Конец абзаца
Есть вертикальное выравнивание текста, а горизонтального нет. кто нить может помочь в этом вопросе?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
а как сделать некотрую часть текста по центру.
создай вручную текстовый объект, отформатируй так, как тебе нужно и затем программно извлеки строковое представление его форматирования.

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Извини за тупость, но я все равно не понимаю как извлечь строковое представление форматирования?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Извини за тупость, но я все равно не понимаю как извлечь строковое представление форматирования?
Поиск в гугле находит ответ за секунду: тынц.

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Это самое первое что я прочитал тогда, за счет чего сделал так:
Contents = String.Format("{0}\\P\\O+{1:F1}\\o", f_name, f_h);Но как выравнять по середине 1 строку текста я не нашел.
По твоим словам я сначала понял как отформатировать в автокаде и програмно вытащить форрматирование текста, но как так и не понял(

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
zmk.autocad, это у тебя от незнания основ программирования, работы с плавающей арифметикой и т.д.
Ничего. Думаю постепенно разберешься.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
zmk.autocad, это у тебя от незнания основ программирования, работы с плавающей арифметикой и т.д.
Ничего. Думаю постепенно разберешься.
Нет на самом деле я прочитал книгу : Зиборов C# 2012
Но не всё как то сразу запоминается. а когда что то сделал сам. пускай даже по чужому тексту, запоминается.
тут главное не тупо ctrl+c =)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
а как сделать некотрую часть текста по центру.
\pxqc = по центру
\pxqr = справа
\pxql = слева
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
а как сделать некотрую часть текста по центру.
\pxqc = по центру
\pxqr = справа
\pxql = слева


Спасибо большое. Сейчас попробую.

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Нет, к сожелению текст вообще пропадает ((

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
или может я не так понял? я вот так написал :
Код - C# [Выбрать]
  1. xaxa.Contents = String.Format("\\pxqc{0}\\P\\O{1:F1}\\o", f_name, f_h);
« Последнее редактирование: 23-04-2015, 21:11:41 от Александр Ривилис »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
У тебя после кода форматирования не хватает точки с запятой (";"). Без неё весь текст проглатывается.
Смотри внимательно:

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Это к000пец. Не когда не замечал что в свойствах, код форматирования прописывают. Хотя если подумать первое где должен был искать это там -) Спасибо большое всё работает! Осталось только обработать ошибки!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Осталось только обработать ошибки!
Это тебе только кажется. :) Ты сейчас это внёс в обычный МТЕКСТ, а теперь нужно чтобы ты создал блок, вставил его и внёс эту информацию в атрибут блока (многострочный).
Сделай следующий шаг!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А зачем создавать блок?
Для того, чтобы решить задачу самым оптимальным способом. Ну и заодно продвинуться в программировании под AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
т.е. сам метод выполнения программы оставить как есть, только создать блок. закинуть туда мой МТЕКСТ и задать ему атрибуты? но как я вытаскивал МТЕКСТ по handle из таблицы, так всё и останется. верно?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
1) Не МТЕКСТ, а многострочный атрибут (команда _ATTDEF и там включить флажок многострочности)

2) Что ты будешь вытаскивать из таблицы - это уже другой вопрос.
3) Вот пример блока, который будешь вставлять. Подредактируй под свои нужды. 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
И давай вернёмся к постановке задачи, а то на 7 страницах я уже её успел потерять. Сформулируй четко:
1) что у тебя есть?
2) что тебе нужно в итоге получить?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
Хорошо.
Есть файл с именем точки и высотой. так сказать нулевой цикл. а потом приходят следующие файлы и при загрузки в автокад вычисляются отклонения от нулевого цикла.

на чертеже это выглядет как окружность с текстом. где в числителе имя марки, а в знаменатели отклонение от нулевого цикла в мм. формата +0.0

Код конечно корявый но какой уж есть -(
class1:
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using Autodesk.AutoCAD.Runtime;
  8. using Autodesk.AutoCAD.Geometry;
  9. using Autodesk.AutoCAD.DatabaseServices;
  10. using Autodesk.AutoCAD.Windows;
  11. using Autodesk.Windows;
  12. using Autodesk.AutoCAD.Colors;
  13.  
  14.  
  15. namespace proekt1
  16. {
  17.     public class Class1 : IExtensionApplication
  18.     {
  19.         static public FRM_GENERAL form1_gener;
  20.         public void Initialize()
  21.         {
  22.         }
  23.         public void Terminate()
  24.         {
  25.  
  26.         }
  27.         [CommandMethod("func_form")]
  28.         public void func_form()
  29.         {
  30.             // Открываем форму для работы
  31.             form1_gener = new FRM_GENERAL();
  32.             form1_gener.Show();
  33.         }
  34.         static public void func_rename_new(string f_new_layers, int f_color_select)
  35.         {
  36.             // Функция активирует слой или создает новый
  37.  
  38.             // получаем данные чертежа
  39.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  40.             Database acDocBase = acDoc.Database;
  41.             Editor acDocEd = acDoc.Editor;
  42.             // Блокируем документ и открываем транзакцию
  43.             using (DocumentLock acDocLock = acDoc.LockDocument())
  44.             {
  45.                 using (Transaction acDocTr = acDocBase.TransactionManager.StartTransaction())
  46.                 {
  47.                     // Добавить проверку на существование слоя!
  48.                     LayerTable tblLayer = (LayerTable)acDocTr.GetObject(acDocBase.LayerTableId, OpenMode.ForRead, false);
  49.                     bool flag_new_layer = false;
  50.                     foreach (ObjectId ent in tblLayer)
  51.                     {
  52.                         LayerTableRecord entLayer = (LayerTableRecord)acDocTr.GetObject(ent, OpenMode.ForRead);
  53.                         acDocEd.WriteMessage("\nLayer name : " + entLayer.Name);
  54.                         if (entLayer.Name == f_new_layers)
  55.                         {
  56.                             flag_new_layer = true;
  57.                         }
  58.                     }
  59.                     if (flag_new_layer == false)
  60.                     {
  61.                         LayerTable acDocLayerTable = acDocTr.GetObject(acDocBase.LayerTableId, OpenMode.ForWrite) as LayerTable;
  62.                         LayerTableRecord acDocNewLayer = new LayerTableRecord();
  63.                         acDocNewLayer.Name = f_new_layers;
  64.                         acDocLayerTable.Add(acDocNewLayer);
  65.                         acDocTr.AddNewlyCreatedDBObject(acDocNewLayer, true);
  66.                         acDocBase.Clayer = acDocLayerTable[f_new_layers];
  67.                         if (f_color_select == 0)
  68.                         {
  69.                         acDocNewLayer.Color = Color.FromRgb(255, 255, 1);
  70.                         }
  71.                         else if (f_color_select == 1)
  72.                         {
  73.                             acDocNewLayer.Color = Color.FromRgb(255, 1, 1);
  74.                         }
  75.                         else if (f_color_select == 2)
  76.                         {
  77.                             acDocNewLayer.Color = Color.FromRgb(1, 2, 255);
  78.                         }
  79.                         else if (f_color_select == 3)
  80.                         {
  81.                             acDocNewLayer.Color = Color.FromRgb(1, 255, 1);
  82.                         }
  83.                         else if (f_color_select == 4)
  84.                         {
  85.                             acDocNewLayer.Color = Color.FromRgb(1, 255, 255);
  86.                         }
  87.                         else
  88.                         {
  89.                             acDocNewLayer.Color = Color.FromRgb(5, 255, 10);
  90.                         }                        
  91.                             acDocTr.Commit();
  92.                     }
  93.                     else
  94.                     {
  95.                         LayerTable acDocLayerTable = acDocTr.GetObject(acDocBase.LayerTableId, OpenMode.ForWrite) as LayerTable;
  96.                         acDocBase.Clayer = acDocLayerTable[f_new_layers];
  97.                         acDocTr.Commit();
  98.                     }
  99.                 }
  100.             }
  101.             // Возвращаем данные и завершаем функцию
  102.             return;
  103.         }
  104.         static public void func_new_circle(string f_name, int f_rad)
  105.         {
  106.             // Функция Создания окружности на чертеже
  107.             // получаем данные чертежа
  108.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  109.             Database acDocBase = acDoc.Database;
  110.             Editor acDocEdit = acDoc.Editor;
  111.            
  112.             // создание круга:
  113.            
  114.             PromptPointResult ppr1 = null; // переменная хранит результат выбора точки пользователем на чертеже
  115.             ppr1 = acDocEdit.GetPoint(new PromptPointOptions("\n Укажите точку № " + f_name));
  116.             if (ppr1.Status == PromptStatus.OK)
  117.             {
  118.                 using (DocumentLock acDocLock = acDoc.LockDocument())
  119.                 {
  120.                     using (Transaction acDocTr = acDocBase.TransactionManager.StartTransaction())
  121.                     {
  122.                         BlockTable TrTable = acDocTr.GetObject(acDocBase.BlockTableId, OpenMode.ForRead) as BlockTable;
  123.                         BlockTableRecord TrTableRec = acDocTr.GetObject(TrTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  124.                         Circle accirc = new Circle();
  125.                         accirc.SetDatabaseDefaults();
  126.                         accirc.Center = ppr1.Value;
  127.                         accirc.Radius = f_rad;
  128.                         TrTableRec.AppendEntity(accirc);
  129.                         acDocTr.AddNewlyCreatedDBObject(accirc, true);
  130.                         ObjectIdCollection obColl = new ObjectIdCollection();
  131.                         obColl.Add(accirc.ObjectId);
  132.                         // окружность создана
  133.                         // создаем штриховк
  134.                         Hatch acHatch = new Hatch();
  135.  
  136.                         TrTableRec.AppendEntity(acHatch);
  137.                         acDocTr.AddNewlyCreatedDBObject(acHatch, true);
  138.  
  139.                         acHatch.SetDatabaseDefaults();
  140.                         acHatch.SetHatchPattern(HatchPatternType.PreDefined, "SOLID");
  141.                         acHatch.Associative = true;
  142.                         acHatch.AppendLoop(HatchLoopTypes.Outermost, obColl);
  143.  
  144.                         // потдверждаем измениния, сохраняем транзакцию
  145.                         acDocTr.Commit();
  146.                     }
  147.                 }    
  148.             }
  149.             // возвращаем данные и закрываем функцию
  150.             return;
  151.         }
  152.         static public long func_new_text(string str_name, string str_h, int size_text)
  153.         {
  154.             // функция создающая текстовое поле рядом с осадочной марокой
  155.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  156.             Database acDocBase = acDoc.Database;
  157.             Editor acDocEdit = acDoc.Editor;
  158.  
  159.             long FP_result_long = new long();
  160.  
  161.             PromptPointResult ppr1 = acDocEdit.GetPoint(new PromptPointOptions("\n Укажите метоположения текста : N = " + str_name));
  162.             if (ppr1.Status == PromptStatus.OK)
  163.             {
  164.  
  165.                 using (DocumentLock acDockLock = acDoc.LockDocument())
  166.                 {
  167.                     using (Transaction acDocTr = acDoc.TransactionManager.StartTransaction())
  168.                     {
  169.                         BlockTable TrTable = acDocTr.GetObject(acDocBase.BlockTableId, OpenMode.ForRead) as BlockTable;
  170.                         BlockTableRecord TrTableRec = acDocTr.GetObject(TrTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  171.  
  172.                         MText acMText = new MText();
  173.                         acMText.SetDatabaseDefaults();
  174.                         acMText.Width = 10;
  175.                         acMText.TextHeight = size_text;
  176.                         acMText.Contents = str_name + "\n";
  177.                         acMText.Location = ppr1.Value;
  178.                         TrTableRec.AppendEntity(acMText);
  179.                         acDocTr.AddNewlyCreatedDBObject(acMText, true);
  180.                        
  181.                         FP_result_long = acMText.Handle.Value;
  182.  
  183.                        
  184.                         acDocTr.Commit();
  185.                        
  186.                     }
  187.                 }
  188.             }          
  189.             // возвращаем данные закрываем работу функции
  190.             return FP_result_long;
  191.         }
  192.         static public string func_edit_text(Double f_h, string f_name, long f_handle)
  193.         {
  194.             string result = null;
  195.            
  196.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  197.             if (acDoc == null)
  198.             {
  199.                 return result;
  200.             }
  201.             Database acDocBase = acDoc.Database;
  202.             Editor acDocEdit = acDoc.Editor;
  203.                        
  204.             Handle ref_handle = new Handle(f_handle);
  205.             ObjectId obj_id = ObjectId.Null;
  206.             Boolean flag_get= acDocBase.TryGetObjectId(ref_handle,out obj_id);
  207.             if (flag_get == false)
  208.             {
  209.                 return result;
  210.             }            
  211.             using (DocumentLock acDockLock = acDoc.LockDocument())
  212.             {
  213.                 using (Transaction acDocTr = acDoc.TransactionManager.StartTransaction())
  214.                 {
  215.                     DBObject get_object = acDocTr.GetObject(obj_id,OpenMode.ForWrite,true);
  216.                     MText xaxa =  (MText)get_object;
  217.                     if (f_h > 0)
  218.                     {
  219.                         result = xaxa.Contents;
  220.                         xaxa.Contents = String.Format("\\pxqc;{0}\\P\\O+{1:F1}\\o", f_name, f_h);
  221.                     }
  222.                     else
  223.                     {
  224.                         xaxa.Contents = String.Format("\\pxqc;{0}\\P\\O{1:F1}\\o", f_name, f_h);
  225.                     }
  226.                     acDocTr.Commit();
  227.                 }
  228.             }
  229.             return result;
  230.         }
  231.         static public string func_edit_text(string f_name, long f_handle)
  232.         {
  233.             string result = null;
  234.             Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  235.             if (acDoc == null)
  236.             {
  237.                 return result;
  238.             }
  239.             Database acDocBase = acDoc.Database;
  240.             Editor acDocEdit = acDoc.Editor;
  241.  
  242.             Handle ref_handle = new Handle(f_handle);
  243.             ObjectId obj_id = ObjectId.Null;
  244.             Boolean flag_get = acDocBase.TryGetObjectId(ref_handle, out obj_id);
  245.             if (flag_get == false)
  246.             {
  247.                 return result;
  248.             }
  249.             using (DocumentLock acDockLock = acDoc.LockDocument())
  250.             {
  251.                 using (Transaction acDocTr = acDoc.TransactionManager.StartTransaction())
  252.                 {
  253.                     DBObject get_object = acDocTr.GetObject(obj_id, OpenMode.ForWrite, true);
  254.                     MText xaxa = (MText)get_object;
  255.                     result = xaxa.Contents;
  256.                     string txt_ka = "н.д.";
  257.                     xaxa.Contents = String.Format("\\pxqc;{0}\\P\\O{1}\\o", f_name, txt_ka);
  258.                     acDocTr.Commit();
  259.                 }
  260.             }
  261.             return result;
  262.         }
  263.     }
  264. }
  265.  
форма FRM_GENERAL.cs
Код - C# [Выбрать]
  1. using System;
  2. using System.IO;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Windows.Forms;
  10.  
  11.  
  12. namespace proekt1
  13. {
  14.     public partial class FRM_GENERAL : Form
  15.     {
  16.         // Объявляем переменные
  17.         public int[] ptk_id; // id марки
  18.         public string[] ptk_name; // имя марки
  19.         public double[] ptk_h; // высота маркиs
  20.         public long[] ptk_objid;
  21.  
  22.         public int[] pt1_id; // id марки
  23.         public string[] pt1_name; // имя марки
  24.         public double[] pt1_h; // высота марки
  25.         public long[] pt1_long;
  26.  
  27.         public int[] pt2_id; // id марки
  28.         public string[] pt2_name; // имя марки
  29.         public double[] pt2_h; // высота марки
  30.         public Color n_color;
  31.  
  32.         public Boolean[] flag_edit;
  33.        
  34.         public FRM_GENERAL()
  35.         {
  36.             InitializeComponent();
  37.         }
  38.  
  39.         private void FRM_GENERAL_Load(object sender, EventArgs e)
  40.         {
  41.             textBox1.Text = "Строка для откладки программы разработчиком";
  42.             textBox2.Text = "70";
  43.             textBox3.Text = "70";
  44.             button1.Tag = "button1";
  45.             button2.Tag = "button2";
  46.             comboBox1.Items.Add("Желтый");
  47.             comboBox1.Items.Add("Красный");
  48.             comboBox1.Items.Add("Синий");
  49.             comboBox1.Items.Add("Зеленый");
  50.             comboBox1.Items.Add("Голубой");
  51.             comboBox2.Items.Add("Желтый");
  52.             comboBox2.Items.Add("Красный");
  53.             comboBox2.Items.Add("Синий");
  54.             comboBox2.Items.Add("Зеленый");
  55.             comboBox2.Items.Add("Голубой");
  56.             button1.Click += new EventHandler(fnc_btn1);
  57.             button2.Click += new EventHandler(fnc_btn1);
  58.  
  59.             n_color = Color.FromArgb(5, 255, 10);
  60.             pictureBox1.BackColor = n_color;
  61.             pictureBox2.BackColor = n_color;
  62.            
  63.  
  64.         }
  65.         public void fnc_select_color(Object sender, EventArgs e)
  66.         {
  67.            
  68.         }
  69.         public void fnc_btn1(object sender, EventArgs e)
  70.         {
  71.             var vr_butt = (Button)sender;
  72.             if(vr_butt.Tag == "button1")
  73.             {
  74.                 // проверка введенных даных пользователем!!! НЕ ЗАБЫТЬ
  75.  
  76.                 // Код для кнопки нулевого цикла
  77.                 // открываем диалоговое окно выбора текстового файла с данными
  78.                 openFileDialog1.Filter = "txt files (*.txt) |*.txt";
  79.                 openFileDialog1.ShowDialog();
  80.                 if (openFileDialog1.FileName == null)
  81.                 {
  82.                     return;
  83.                 }
  84.                 // считываем данные из файла
  85.                 FileStream fl1_pth = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
  86.                 StreamReader fl1_reader = new StreamReader(fl1_pth);
  87.                 String txt_read_f1 = fl1_reader.ReadToEnd();
  88.                 fl1_reader.Close();
  89.                 String[] txt_mas_f1 = txt_read_f1.Split(new Char[]{ '\t', '\n' });
  90.                 // определяем размерность массива
  91.                 int i = 1;
  92.                 int ii = 0;
  93.                 int length_mas = txt_mas_f1.Length / 2;
  94.                 // инициализируем главные массивы данных
  95.                 ptk_id = new int[length_mas];
  96.                 ptk_name = new string[length_mas];
  97.                 ptk_h = new double[length_mas];
  98.                // ptk_objid = new long[length_mas];
  99.                 ptk_objid = new long[length_mas];
  100.                 // определяем десятичный разделитель системы
  101.                 Char separator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator[0];
  102.                
  103.                 Hide(); // скрываем главную форму работаем в автокаде
  104.  
  105.                 // Делаем активный слой осадочные марки, если его нет то создаем его
  106.                
  107.                
  108.                 foreach (String vr in txt_mas_f1)
  109.                 {
  110.                     if (i % 2 == 1)
  111.                     {
  112.                         if (vr == "" || vr == " " || vr == null)
  113.                         {
  114.  
  115.                         }
  116.                         else
  117.                         {
  118.                         Class1.func_rename_new("осадочные марки", comboBox1.SelectedIndex);
  119.                         ptk_id[ii] = ii;
  120.                         ptk_name[ii] = vr;
  121.                         // создаем окружность осадочной марки на чертеже
  122.                         Class1.func_new_circle(vr, Convert.ToInt16(textBox2.Text));
  123.                         }
  124.                        
  125.                     }else{
  126.                         Class1.func_rename_new("текст осадочной марки", comboBox2.SelectedIndex);
  127.                         string aaa = vr.Replace(',', separator);
  128.                         ptk_h[ii] = Convert.ToDouble(aaa);
  129.                         textBox1.Text += Environment.NewLine;
  130.                         textBox1.Text += "id : " + ptk_id[ii] + " name : " + ptk_name[ii] + " h : " + ptk_h[ii];
  131.                        
  132.                         // создаем текст высотной отметки и получаем данные
  133.                         long vr_data = Class1.func_new_text(ptk_name[ii], vr, Convert.ToInt16(textBox3.Text));
  134.                         // long vr_data = Class1.func_new_text(ptk_name[ii], vr, Convert.ToInt16(textBox3.Text));
  135.                         ptk_objid[ii] = vr_data;
  136.                         ii++;
  137.                         textBox1.Text += Environment.NewLine;
  138.                         textBox1.Text += "vr data : " + vr_data;
  139.                     }
  140.                     i++;
  141.                 }
  142.                     // открываем форму
  143.                     Show();
  144.                     // записываем готовую массив
  145.                     saveFileDialog1.Filter = "текстовый файл (*.txt) | *.txt";
  146.                     saveFileDialog1.ShowDialog();
  147.                     if (saveFileDialog1.FileName == null)
  148.                     {
  149.                         return;
  150.                     }
  151.                     FileStream fstream1;
  152.                     if (checkBox1.Checked == true)
  153.                     {
  154.                         fstream1 = new FileStream(saveFileDialog1.FileName, FileMode.Append);
  155.                     }
  156.                     else {
  157.                         fstream1 = new FileStream(saveFileDialog1.FileName, FileMode.Create, FileAccess.Write);
  158.                     }
  159.                     StreamWriter sw1 = new StreamWriter(fstream1);
  160.                     string vr_for = null;
  161.                     for (int for_i = 0; for_i < length_mas; for_i++)
  162.                     {
  163.                         vr_for = null;
  164.                        
  165.                       //  vr_for = Convert.ToString(ptk_id[for_i]) + "\t" + Convert.ToString(ptk_name[for_i]) + "\t" + Convert.ToString(ptk_h[for_i]) + "\t" + ptk_objid[for_i];
  166.                         vr_for = String.Format("{0}\t{1}\t{2}\t{3}", ptk_id[for_i], ptk_name[for_i], ptk_h[for_i], ptk_objid[for_i]);
  167.                         sw1.WriteLine(vr_for);
  168.                     }
  169.                     sw1.Close();
  170.             }
  171.             if (vr_butt.Tag == "button2")
  172.             {
  173.                 openFileDialog1.Filter = "txt files (*.txt) |*.txt";
  174.                 openFileDialog1.ShowDialog();
  175.                 if (openFileDialog1.FileName == null)
  176.                 {
  177.                     return;
  178.                 }
  179.                 // считываем данные из файла
  180.                 FileStream fl1_pth = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
  181.                 StreamReader fl1_reader = new StreamReader(fl1_pth);
  182.                 String txt_read_f1 = fl1_reader.ReadToEnd();
  183.                 fl1_reader.Close();
  184.  
  185.                 String[] txt_mas_f1 = txt_read_f1.Split(new Char[] { '\t', '\n' });
  186.  
  187.                 int i = 1;
  188.                 int ii = 0;
  189.  
  190.                 pt1_id = new int[txt_mas_f1.Length / 4];
  191.                 pt1_h = new double[txt_mas_f1.Length / 4];
  192.                 pt1_name = new string[txt_mas_f1.Length / 4];
  193.                 pt1_long = new long[txt_mas_f1.Length / 4];
  194.  
  195.                 foreach(String vr_data1 in txt_mas_f1)
  196.                 {
  197.                     switch (i)
  198.                     {
  199.                         case 1:
  200.                             if (vr_data1 == null || vr_data1=="" || vr_data1==" ")
  201.                             {
  202.  
  203.                             }
  204.                             else {
  205.                             if (vr_data1 != "") {
  206.                             pt1_id[ii] = Convert.ToInt16(vr_data1);
  207.                             textBox1.Text += Environment.NewLine + "ok1 = " + vr_data1 + " - " + pt1_id[ii];
  208.                             }
  209.                             }
  210.                             break;
  211.                         case 2:
  212.                            
  213.                             pt1_name[ii] = vr_data1;
  214.                             textBox1.Text += Environment.NewLine + "ok2 = " + vr_data1 + " - " + pt1_name[ii];
  215.                             break;
  216.                         case 3:
  217.                            
  218.                             pt1_h[ii] = Convert.ToDouble(vr_data1);
  219.                             textBox1.Text += Environment.NewLine + "ok3 = " + vr_data1 + " - " + pt1_h[ii];
  220.                             break;
  221.                         case 4:
  222.                             pt1_long[ii] = Int64.Parse(vr_data1);
  223.                                                        
  224.                             textBox1.Text += Environment.NewLine + "ok4 = " + vr_data1 + " - " + pt1_long[ii];
  225.                            
  226.                             i = 0;
  227.  
  228.                             textBox1.Text += Environment.NewLine;
  229.                             ii++;
  230.                             break;
  231.                     }
  232.                     i++;
  233.                 }
  234.                 openFileDialog1.Filter = "txt files (*.txt) |*.txt";
  235.                 openFileDialog1.ShowDialog();
  236.                 if (openFileDialog1.FileName == null)
  237.                 {
  238.                     return;
  239.                 }
  240.                 // считываем данные из файла
  241.                 FileStream fl2_pth = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
  242.                 StreamReader fl2_reader = new StreamReader(fl2_pth);
  243.                 String txt_read_f2 = fl2_reader.ReadToEnd();
  244.                 fl2_reader.Close();
  245.  
  246.                 String[] txt_mas_f2 = txt_read_f2.Split(new Char[] { '\t', '\n' });
  247.  
  248.                 i = 1;
  249.                 ii = 0;
  250.  
  251.                 pt2_id = new int[txt_mas_f2.Length / 2];
  252.                 pt2_h = new double[txt_mas_f2.Length / 2];
  253.                 pt2_name = new string[txt_mas_f2.Length / 2];
  254.                 Char separator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator[0];
  255.                 string aaa;
  256.                 foreach (String vr_data2 in txt_mas_f2)
  257.                 {
  258.                     switch (i)
  259.                     {
  260.                         case 1:
  261.                             if (vr_data2 == null || vr_data2=="" || vr_data2==" ")
  262.                             {
  263.  
  264.                             }
  265.                             else
  266.                             {
  267.  
  268.                             textBox1.Text += "case1 ii = " + ii + " i = " + i;
  269.                             pt2_name[ii] = vr_data2;
  270.                            
  271.                             }
  272.                             break;
  273.                         case 2:
  274.                             aaa = vr_data2.Replace(',', separator);
  275.                             pt2_h[ii] = Convert.ToDouble(aaa);
  276.                             // pt2_h[ii] = Convert.ToDouble(vr_data2);
  277.                             textBox1.Text += "case2 ii = " + ii + " i = " + i;
  278.                             i = 0;
  279.                             ii++;
  280.                             break;
  281.                     }
  282.                     i++;
  283.                 }
  284.                 Double razn = new double();
  285.                 flag_edit = new Boolean[pt1_id.Length];
  286.                 Hide();
  287.                 for (i = 0; i < pt2_name.Length; i++)
  288.                 {
  289.                    
  290.                     for (ii = 0; ii < pt1_name.Length; ii++)
  291.                     {
  292.                        
  293.                         if (pt1_name[ii] == pt2_name[i])
  294.                         {
  295.                             flag_edit[ii] = true;
  296.                             textBox1.Text += Environment.NewLine + "yes : " + pt1_name[ii];
  297.                             textBox1.Text += Environment.NewLine + " | " + pt2_h[i] + " | " + pt1_h[ii];
  298.                             razn = Math.Round((pt2_h[i] - pt1_h[ii]) * 1000,2);
  299.                             textBox1.Text += Environment.NewLine + " - text edit - " + Class1.func_edit_text(razn, pt2_name[i], pt1_long[ii]);
  300.                         }
  301.                     }
  302.                 }
  303.                 for (i = 0; i < pt1_name.Length; i++)
  304.                 {
  305.                     if (flag_edit[i] != true & checkBox2.Checked==false)
  306.                     {
  307.                         Class1.func_edit_text(pt1_name[i], pt1_long[i]);
  308.                     }
  309.                 }
  310.                 Show();
  311.             }
  312.         }
  313.  
  314.         private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
  315.         {
  316.             Color n_color;
  317.             switch (comboBox1.SelectedIndex)
  318.             {
  319.                 case 0:
  320.                     n_color = Color.FromArgb(255,255,1);
  321.                     break;
  322.                 case 1:
  323.                     n_color = Color.FromArgb(255, 1, 1);
  324.                     break;
  325.                 case 2:
  326.                     n_color = Color.FromArgb(1, 2, 255);
  327.                     break;
  328.                 case 3:
  329.                     n_color = Color.FromArgb(1, 255, 1);
  330.                     break;
  331.                 case 4:
  332.                     n_color = Color.FromArgb(1, 255, 255);
  333.                     break;
  334.                 default:
  335.                     n_color = Color.FromArgb(5, 255, 10);
  336.                     break;
  337.             }
  338.             ComboBox cmb_vr = (ComboBox)sender;
  339.  
  340.             if (cmb_vr.Tag == "1")
  341.             {
  342.                 switch (comboBox1.SelectedIndex)
  343.                 {
  344.                     case 0:
  345.                         n_color = Color.FromArgb(255, 255, 1);
  346.                         break;
  347.                     case 1:
  348.                         n_color = Color.FromArgb(255, 1, 1);
  349.                         break;
  350.                     case 2:
  351.                         n_color = Color.FromArgb(1, 2, 255);
  352.                         break;
  353.                     case 3:
  354.                         n_color = Color.FromArgb(1, 255, 1);
  355.                         break;
  356.                     case 4:
  357.                         n_color = Color.FromArgb(1, 255, 255);
  358.                         break;
  359.                     default:
  360.                         n_color = Color.FromArgb(5, 255, 10);
  361.                         break;
  362.                 }
  363.                 pictureBox1.BackColor = n_color;
  364.             }
  365.             else
  366.             {
  367.                 switch (comboBox2.SelectedIndex)
  368.                 {
  369.                     case 0:
  370.                         n_color = Color.FromArgb(255, 255, 1);
  371.                         break;
  372.                     case 1:
  373.                         n_color = Color.FromArgb(255, 1, 1);
  374.                         break;
  375.                     case 2:
  376.                         n_color = Color.FromArgb(1, 2, 255);
  377.                         break;
  378.                     case 3:
  379.                         n_color = Color.FromArgb(1, 255, 1);
  380.                         break;
  381.                     case 4:
  382.                         n_color = Color.FromArgb(1, 255, 255);
  383.                         break;
  384.                     default:
  385.                         n_color = Color.FromArgb(5, 255, 10);
  386.                         break;
  387.                 }
  388.                 pictureBox2.BackColor = n_color;
  389.             }
  390.            
  391.            
  392.  
  393.         }
  394.  
  395.         private void label4_Click(object sender, EventArgs e)
  396.         {
  397.             label4.ForeColor = Color.FromArgb(255, 5, 5);
  398.         }
  399.     }
  400. }
  401.  

Оффлайн zmk.autocadАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 64
  • Карма: 0
вот во вложениях пример фала нулевого цикла и первого, а также сам dll файл.
Механизм работы программы:
- при нажатии разместить осадочные марки выбираете файл 0 цикла и размещаете марки. затем сохраняете готовый нулевой цикл, в котором сохранены handle на текстовые поля.
- при нажатии выполнить отклонения button2.Click сначала выбираете готовый нулевой цикл с handle который был сохранен после размещения марок, а затем 1 цикл в данном случае.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я не буду критиковать стиль программирования, хотя думаю, что нужно бы его подправить (например, switch вместо цепочки if). Но мне не нравится ни постановка задачи (если это можно назвать постановкой задачи), ни её реализация. Всё это нормально решается блоками с атрибутами, что резко упрощает задачу и снимает необходимость хранить метки примитивов, если считать, что M1, M2 и т.д - это уникальные номера точек. Но думаю, что трёх сделанных в этой теме намёков на блок с атрибутами вполне достаточно. Больше не буду настаивать. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн RevitTormentor

  • ADN OPEN
  • ***
  • Сообщений: 162
  • Карма: 6
Цитата: zmk.autocad от 22-04-2015, 17:42:44
Извини за тупость, но я все равно не понимаю как извлечь строковое представление форматирования?
Поиск в гугле находит ответ за секунду: тынц.

Дано: 2 размера в шаблоне, у каждого свой стиль. (или мультивыноски со своими стилями)
Задача: Создаю размер RotatedDimension к нему нужно применить один из стилей которые есть в шаблоне.

В ответе по ссылке, взять стиль с заранее созданного объекта, это ведь не имелось ввиду строчка acMText.SetDatabaseDefaults();?
Я так понимаю по ссылке строчка acMText.SetDatabaseDefaults(); это параметры по умолчанию в том числе и стиль из базы.

Лучше стиль для размера лучше создавать программно, шаблон может и не подгрузиться по разным причинам? Чтобы разобраться со стилями всё-таки хочу взять стиль с готового объекта и, немного его подкорректировав, применить к вновь создаваемому размеру или другому объекту.

Вопрос 1: А как извлечь размерный стиль по имени?
Вопрос 2: Как извлечь стиль из шаблона dwt, который лежит как ресурс?


Спасибо
« Последнее редактирование: 01-01-2018, 20:49:33 от RevitTormentor »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Один вопрос - одна тема. И очень подробненько.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение