Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 23-09-2016, 21:10:29

Название: AutoCAD API Scale
Отправлено: Алексей (IdeaSoft) от 23-09-2016, 21:10:29
Всем привет!
Такая ситуация. К примеру есть чертеж, в котором отрезок длиной 100 ед. (не важно метры, мм, дюймы).
Чтобы сделать отрезок в 50 ед., делаю так:

Код - vb.net [Выбрать]
  1. Entity.TransformBy(Matrix3d.Scaling(0.5, point3d(...)))

Но кроме примитивов нужно еще пройти и по таблице размерных стилей и поменять масштаб всем стилям. 
Может кроме размерных стилей еще кому-то нужно сделать scale?

Есть какая либо хорошая альтернатива в API AutoCAD,
которая грамотно сделает scale всему dwg-файлу?





Название: Re: AutoCAD API Scale
Отправлено: Александр Ривилис от 23-09-2016, 21:39:29
Но кроме примитивов нужно еще пройти и по таблице размерных стилей и поменять масштаб всем стилям. 
Зачем? После того, как отрезок у тебя уменьшился в 2 раза какой размер у него должен быть? Остаться прежним или измениться в два раза?
Название: Re: AutoCAD API Scale
Отправлено: Алексей (IdeaSoft) от 23-09-2016, 22:08:48
какой размер у него должен быть?
Остаться прежним, а то получается как на картинке.

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs10.postimg.org%2F572ra2a85%2Fimage.jpg&hash=a5d1300f95b6edb1e0705b01f03f46e1) (http://postimg.org/image/572ra2a85/)
Название: Re: AutoCAD API Scale
Отправлено: Александр Ривилис от 23-09-2016, 22:22:26
Ну тогда придётся обновлять размерные стили.
Название: Re: AutoCAD API Scale
Отправлено: Алексей (IdeaSoft) от 23-09-2016, 22:45:38
Ну тогда придётся обновлять размерные стили.
На сколько я понял - это специальная задачка и в стандартных
функциях AutoCAD такого быть не может
и нужно писать "плагинчик".
Название: Re: AutoCAD API Scale
Отправлено: Александр Ривилис от 24-09-2016, 01:37:18
На сколько я понял - это специальная задачка и в стандартных
функциях AutoCAD такого быть не может
и нужно писать "плагинчик".
Этого я не понял. Вообще-то вопрос задан в разделе Программирование, что уже подразумевает написание "плагинчика". Можно конечно и "вручную" средствами AutoCAD без программирования отредактировать все размерные стили, выбрать все размеры и обновить их.
Название: Re: AutoCAD API Scale
Отправлено: Алексей (IdeaSoft) от 24-09-2016, 03:56:53
Вообще-то вопрос задан в разделе Программирование, что уже подразумевает написание "плагинчика"
Все верно ты говоришь! Цель моего вопроса состояла в том что бы выяснить что делать?
1) Писать программу
2) Не писать программу

Так как бывают такие ситуации в работе, когда в чем-то не разберешься
до конца и начинаешь писать программку, а потом вдруг выясняется,
что можно было не мучатся и не писать ее, так как в AutoCAD уже есть
для этого готовая команда.

Конечно пользователь все может сделать руками.
Но когда у пользователя несколько сотен таких файлов, задача
не решается не в один клик, пользователь может просто
забыть что-то сделать, то конечно программа будет ему в помощь.
 
Название: Re: AutoCAD API Scale
Отправлено: Максим Маркевич от 24-09-2016, 15:44:55
Есть какая либо хорошая альтернатива в API AutoCAD,
которая грамотно сделает scale всему dwg-файлу?
Это ты, конечно, против логики системы пошел.  ;)
Остаться прежним, а то получается как на картинке.
Ты можешь не менять размерный стиль, а просто считывать значение размера в объекте до масштабирования, а потом это значение просто записывать в масштабируемый размер. Как я понял, концепции твоей это не помешает.
Каждый раз менять размерный стиль - это совсем неудобно и ненужно(ИМХО)!!!


Код - C# [Выбрать]
  1. using System;
  2. using AppServCore = Autodesk.AutoCAD.ApplicationServices.Core;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using Autodesk.AutoCAD.Geometry;
  7.  
  8. namespace Testing
  9. {
  10.     public class DimScale
  11.     {
  12.         [CommandMethod("DS")]
  13.         public static void DS()
  14.         {
  15.             var doc = AppServCore.Application.DocumentManager.MdiActiveDocument;
  16.             if (doc == null)
  17.                 return;
  18.             var db = doc.Database;
  19.             var ed = doc.Editor;
  20.             double value;
  21.             using (doc.LockDocument())
  22.             {
  23.                 using (var tr = db.TransactionManager.StartTransaction())
  24.                 {
  25.                     var pp1 = ed.GetPoint("Выберете опорную точку: ") as PromptPointResult;
  26.                     if (pp1.Status != PromptStatus.OK)
  27.                     {
  28.                         return;
  29.                     }
  30.                     var acSelSetPrompt = ed.GetSelection() as PromptSelectionResult;
  31.                     if (acSelSetPrompt.Status == PromptStatus.OK)
  32.                     {
  33.                         var acSSet = acSelSetPrompt.Value;
  34.                         foreach (SelectedObject acSelSetObj in acSSet)
  35.                         {
  36.                             if (acSelSetObj != null)
  37.                             {
  38.                                 var alignDim = tr.GetObject(acSelSetObj.ObjectId, OpenMode.ForWrite) as AlignedDimension;
  39.                                 if (alignDim != null)
  40.                                 {
  41.                                     value = Math.Round(alignDim.Measurement);
  42.                                     alignDim.DimensionText = Convert.ToString(value);
  43.                                 }
  44.                             }
  45.                         }
  46.                         foreach (SelectedObject acSelSetObj in acSSet)
  47.                         {
  48.                             if (acSelSetObj != null)
  49.                             {
  50.                                 var entity = tr.GetObject(acSelSetObj.ObjectId, OpenMode.ForWrite) as Entity;
  51.                                 if (entity != null)
  52.                                 {
  53.                                     entity.TransformBy(Matrix3d.Scaling(0.5, pp1.Value));
  54.                                 }
  55.                             }
  56.                         }
  57.                     }
  58.                     tr.Commit();
  59.                 }
  60.             }
  61.         }
  62.     }
  63. }
Название: Re: AutoCAD API Scale
Отправлено: Алексей (IdeaSoft) от 24-09-2016, 18:34:12
Каждый раз менять размерный стиль - это совсем неудобно
Поменять размерный стиль нужно всего только один раз.
Так в основном эта проблема связана с исходными данными
Так сказать привел исходные данные в нужный вид и работай дальше.
Я еще на видео обратил внимание на то, что высота текста размерного
стиля остается прежней. А бываю случаи, когда исходные данные приходят в мм,
а их нужно перевести в метры, т.е. в 1000 раз уменьшить чертеж.
Уменьшить в раза это же я просто как пример показал.
При уменьшении чертежа в 1000 раз высота текста размеров
становятся просто огромными и закрывают чертеж.
   
Название: Re: AutoCAD API Scale
Отправлено: Максим Маркевич от 24-09-2016, 20:29:49
Поменять размерный стиль нужно всего только один раз.
Да ладно? А потом при выполнении новых объектов они будут на измененном стиле, и его снова придется менять?
Я еще на видео обратил внимание на то, что высота текста размерного
стиля остается прежней. А бываю случаи, когда исходные данные приходят в мм,
а их нужно перевести в метры, т.е. в 1000 раз уменьшить чертеж.
Ну так завяжи в свойствах и высоту текста и размеры выносок. Все равно, это будет корректнее, чем менять размерный стиль. ИМХО.
У меня создается впечатление, что ты не совсем понимаешь суть работы со стилями в акаде.
Ведь ты пойми, если у тебя часть объектов нужно масштабировать, а часть нет, то те, которые не трогались, тоже полетят, потому что у них такой же стиль.
В общем, либо я тебя не понимаю, либо ты очень плохо пояснил свою задачу/выбрал плохой пример.