Корректировка размеров

Главная Форумы Задать вопрос Корректировка размеров

Просмотр 15 сообщений - с 1 по 15 (из 20 всего)
  • Автор
    Сообщения
  • #4683 Score: 1
    kisli
    Участник
    16 pts

    Всем доброго времени суток. Думаю все кто работают в Ревит сталкивались с одним его минусом, то что размеры не растаскиваются по умолчанию. То есть имея много размеров тонких конструкций.

     

    В справке у класса Dimension Есть параметр который можно вроде как устанавливать, 

    но на одном забугорном форуме однозначно сказали что, мол нельзя менять положение текста размеров, правда как я понял имелись в виду только те что уже проставлены. PS Там этот вопрос обсуждаля ещё в 2012 году может сейчас все и не так)

    Но может есть возможность задавать этот параметр до его простановки?

     

     

    #4688 Score: 2
    kisli
    Участник
    16 pts

    В общем если кому то интересно, то такая возможность имеется, и размерный текст можно двигать програмно. Если кому интересно то вот код макроса… Он на C# но думаю все всем понятно, и при желании его можно к питону в легкую запилить, и наверное в динамо)

    
    public void DimText()
    {
    Document doc = this.ActiveUIDocument.Document;
    //Application app = this.Application;
    UIDocument uidoc = new UIDocument(doc);
    //Выбираес размеры
    IList elementList = uidoc.Selection.PickElementsByRectangle();
    
    using (Transaction t = new Transaction(doc,"Move dim text"))
    {
    t.Start();
    //проходимся по каждому размеру
    foreach (Dimension element in elementList)
    {
    //если количество сегментов больше 1 то работаем с каждым сегментом по отдельности
    if (element.NumberOfSegments>1)
    {
    foreach (DimensionSegment S in element.Segments)
    {
    data+=S.ValueString+Environment.NewLine;
    S.TextPosition=new XYZ(S.TextPosition.X+1,S.TextPosition.Y + 1, 0);
    }
    }
    //Если 1 то с самим размером
    else
    element.TextPosition=new XYZ(element.TextPosition.X+1,element.TextPosition.Y + 1, 0);
    }
    t.Commit();
    }
    }
    
    

    Надо бы еще допилить фильтры, чтоб он не редактировал размеры больше определенного значения, и настроить правила разноса и можно сделать не хуже чем в в Allplan )

     

    #4692 Score: 10
    kisli
    Участник
    16 pts

    В общем такая штука получилась, иногда глючит но жизнь облегчает, если кому то надо обращайтесь)

    #4693 Score: 2
    Legantmar
    Хранитель
    474 pts

    круто, молодец!

    #4707 Score: 0
    Alex Babinoff
    Модератор
    13 pts

    Надо! Ещё как надо. Как узнал сегодня вечером, что завтра к обеду за час надо тыщу с хвостом размеров выдать, сразу вспомнил где видел подобное ) Вот только на питон так просто не переведу.

    #4716 Score: 0
    Александр
    Участник

    А можно что-то подобное для оборудования сделать? чтобы размеры до элемента от  стены получить?

    #4717 Score: 0
    kisli
    Участник
    16 pts

    Можно, во всяком случае не вижу никаких ограничений для такой реализации, хотя мало ли)) Иногда простое действие приходится реализовывать с помощью таких костылей, что мама не горюй)

    #4718 Score: 1
    Legantmar
    Хранитель
    474 pts
    #4749 Score: 0
    ent1g
    Участник
    8 pts

    Товарищ kisli, а как Вы настроили правило разноса размеров в разные стороны?

    #4751 Score: 0
    kisli
    Участник
    16 pts

    В каждом экземпляре объекта Dimension есть параметр TextPosition  и если цепочка то нужно работать с DimensionSegment, собственно если значение размера меньше определенного значения, то делаете смещение параметра TextPosition

     

     

    #4837 Score: 0
    Alex Babinoff
    Модератор
    13 pts

    Ещё раз доброго. Таки перепиливаю ваш скрипт в питоне и с DimensionSegment и TextPosition разобрались. Интересует ещё вот какой вопрос, у вас на видео, при запуске скрипта происходит выбор элементов рамкой, так понимаю это PickElementsByRectangle Method, но вот в чём вопрос, при создании размера у него же в задаваемых параметрах должна быть линия, по которой этот размер создаётся. Получается можно как-то получить геометрию этой рамки, и на основании её сгенерировать линию? Не могу найти, как эту геометрию получить. Или же у вас там как-то по другому?

    #4838 Score: 1
    kisli
    Участник
    16 pts

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

    #4842 Score: 1
    Alex Babinoff
    Модератор
    13 pts

    Вот как-то так это получилось в динамо и питоне:

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

     

    #9277 Score: 0
    yuriy
    Участник
    1 pt

    Выложите пожалуйста скрипт. Давно интересует эта тема

    #9394 Score: 0
    yuriy
    Участник
    1 pt

    Помогите собрать решение

     

    /*
    * Created by SharpDevelop.
    * User: user
    * Date: 23.08.2019
    * Time: 15:05
    *
    * To change this template use Tools | Options | Coding | Edit Standard Headers.
    */
    using System;
    using Autodesk.Revit.UI;
    using Autodesk.Revit.DB;
    using Autodesk.Revit.UI.Selection;
    using System.Collections.Generic;
    using System.Linq;

    namespace test
    {
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    [Autodesk.Revit.DB.Macros.AddInId(“2453F3E5-7147-4793-949F-4CA4035A27B2″)]
    public partial class ThisApplication
    {
    private void Module_Startup(object sender, EventArgs e)
    {

    }

    private void Module_Shutdown(object sender, EventArgs e)
    {

    }
    public void DimText()

    {
    Document doc = this.ActiveUIDocument.Document;
    //Application app = this.Application;
    UIDocument uidoc = new UIDocument(doc);
    //Выбираес размеры
    IList<Element> elementList = uidoc.Selection.PickElementsByRectangle();

    using (Transaction t = new Transaction(doc,”Move dim text”))
    {
    t.Start();
    //проходимся по каждому размеру
    foreach (Dimension element in elementList)
    {
    //если количество сегментов больше 1 то работаем с каждым сегментом по отдельности
    if (element.NumberOfSegments>1)
    {
    foreach (DimensionSegment S in element.Segments)
    {
    data+=S.ValueString+Environment.NewLine;
    S.TextPosition=new XYZ(S.TextPosition.X+1,S.TextPosition.Y + 1, 0);
    }
    }
    //Если 1 то с самим размером
    else
    element.TextPosition=new XYZ(element.TextPosition.X+1,element.TextPosition.Y + 1, 0);
    }
    t.Commit();
    }
    }

    #region Revit Macros generated code
    private void InternalStartup()
    {
    this.Startup += new System.EventHandler(Module_Startup);
    this.Shutdown += new System.EventHandler(Module_Shutdown);
    }
    #endregion
    }
    }

     

    Выдает ошибку:

    Имя “data” отсутствует в текущем контексте (CS0103)

     

Просмотр 15 сообщений - с 1 по 15 (из 20 всего)
  • Для ответа в этой теме необходимо авторизоваться.