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

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

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

Оффлайн 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
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Приветствую на форуме!
P.S. не могу найти кнопки спасибо на вашем форуме :(


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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь 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
Тут можно глянуть пару мультиков с похожими "текстбоксами". Исходный код, ежели что, выложен там же.
Большое спасибо! скорее всего это то что нужно!