ADN Club > Civil 3D API
Изменение параметров чертежа
Georg:
Добрый день!
Появился вопрос, каким образом можно сформировать транзакцию для изменения параметров чертежа? Видел тут такой пример https://adn-cis.org/parametryi-chertezha-dwg.html, но хочу повторить это на C#.
--- Код - C# [Выбрать] ---using Autodesk.Civil.ApplicationServices;using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.DatabaseServices;namespace Civil3D_DrawingProperties{ public class C3D_Extensions_Terno { //Нод для смены системы единиц на метрическую public static void ChangeDrawingUnitsToMeters(bool condition_meters) { //На вход подается условие - нужны ли метр, если false - то работает данный метод (if далее) Document m_Doc = Application.DocumentManager.MdiActiveDocument; Database db = m_Doc.Database; //Они сами по себе, а строки ниже - сами по себе, это верно?! CivilDocument c3d_doc = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument; var Units_Window = c3d_doc.Settings.DrawingSettings; //Инициация изменяемых переменных var _DrawingUnits = Units_Window.UnitZoneSettings.DrawingUnits; var _AngularUnits = Units_Window.UnitZoneSettings.AngularUnits; var _ImperialToMetricConversion = Units_Window.UnitZoneSettings.ImperialToMetricConversion; var _ScaleObjectsFromOtherDrawings = Units_Window.UnitZoneSettings.ScaleObjectsFromOtherDrawings; var _MatchAutoCADVariables = Units_Window.UnitZoneSettings.MatchAutoCADVariables; var _DrawingScale = Units_Window.UnitZoneSettings.DrawingScale; var _DrivingDirection = Units_Window.AmbientSettings.General.DrivingDirection.Value; var _Time = Units_Window.AmbientSettings.Time.Unit.Value; var _Distance = Units_Window.AmbientSettings.Distance.Unit.Value; var _Dimension = Units_Window.AmbientSettings.Dimension.Unit.Value; var _Coordinate = Units_Window.AmbientSettings.Coordinate.Unit.Value; var _GridCoordinate = Units_Window.AmbientSettings.GridCoordinate.Unit.Value; var _Elevation = Units_Window.AmbientSettings.Elevation.Unit.Value; var _Area = Units_Window.AmbientSettings.Area.Unit.Value; var _Volume = Units_Window.AmbientSettings.Volume.Unit.Value; var _Speed = Units_Window.AmbientSettings.Speed.Unit.Value; var _Angle = Units_Window.AmbientSettings.Angle.Unit.Value; var _Direction = Units_Window.AmbientSettings.Direction.Unit.Value; var _LatLong = Units_Window.AmbientSettings.LatLong.Unit.Value; var _Grade = Units_Window.AmbientSettings.Grade.Format.Value; var _Slope = Units_Window.AmbientSettings.Slope.Format.Value; var _GradeSlope = Units_Window.AmbientSettings.GradeSlope.Format.Value; var _Station = Units_Window.AmbientSettings.Station.Unit.Value; var _Acceleration = Units_Window.AmbientSettings.Acceleration.Unit.Value; var _Pressure = Units_Window.AmbientSettings.Pressure.Unit.Value; if (condition_meters == false) { //using (Transaction m_Tr = db.TransactionManager.StartTransaction()) // using (Transaction tr = db.TransactionManager.StartTransaction()) { _DrawingUnits = Autodesk.Civil.Settings.DrawingUnitType.Meters; //2 _AngularUnits = Autodesk.Civil.AngleUnitType.Degree; //179 _ImperialToMetricConversion = Autodesk.Civil.Settings.ImperialToMetricConversionType.InternationalFoot; //536870912; _ScaleObjectsFromOtherDrawings = true; _MatchAutoCADVariables = true; _DrawingScale = Units_Window.UnitZoneSettings.DrawingScale = 1;// 1.0; _DrivingDirection = Autodesk.Civil.DrivingDirectionType.RightSideOfTheRoad;// 0; _Time = Autodesk.Civil.TimeUnitType.Minute;//301; _Distance = Autodesk.Civil.LinearUnitType.Meter;// 2; _Dimension = Autodesk.Civil.LinearUnitType.Meter;// 2; _Coordinate = Autodesk.Civil.LinearUnitType.Meter;// 2; _GridCoordinate = Autodesk.Civil.LinearUnitType.Meter; // 2; _Elevation = Autodesk.Civil.LinearUnitType.Meter; // 2; _Area = Autodesk.Civil.AreaUnitType.SquareMeter; //55; _Volume = Autodesk.Civil.VolumeUnitType.CubicMeter;// 96; _Speed = Autodesk.Civil.SpeedUnitType.KilometerPerHour;// 190; _Angle = Autodesk.Civil.AngleUnitType.Degree;// 179; _Direction = Autodesk.Civil.AngleUnitType.Degree;// 179; _LatLong = Autodesk.Civil.AngleUnitType.Degree;// 179; _Grade = Autodesk.Civil.GradeFormatType.Decimal;// 2468; _Slope = Autodesk.Civil.SlopeFormatType.RiseRun;// 2465; _GradeSlope = Autodesk.Civil.GradeSlopeFormatType.Decimal;// 2468; _Station = Autodesk.Civil.LinearUnitType.Meter;// 2; _Acceleration = Autodesk.Civil.AccelerationUnitType.MeterPerSecSquared;// 202; _Pressure = Autodesk.Civil.PressureUnitType.Kilopascal;// 240; tr.Commit(); } } else { using (Transaction tr = db.TransactionManager.StartTransaction()) { _DrawingUnits = Autodesk.Civil.Settings.DrawingUnitType.Feet; //30 _AngularUnits = Autodesk.Civil.AngleUnitType.Degree; //179 _ImperialToMetricConversion = Autodesk.Civil.Settings.ImperialToMetricConversionType.InternationalFoot; //536870912; _ScaleObjectsFromOtherDrawings = false; _MatchAutoCADVariables = false; _DrawingScale = Units_Window.UnitZoneSettings.DrawingScale = 1;// 1.0; _DrivingDirection = Autodesk.Civil.DrivingDirectionType.RightSideOfTheRoad;// 0; _Time = Autodesk.Civil.TimeUnitType.Minute;//301; _Distance = Autodesk.Civil.LinearUnitType.Foot;// 30; _Dimension = Autodesk.Civil.LinearUnitType.Inch;// 31; _Coordinate = Autodesk.Civil.LinearUnitType.Foot;// 30; _GridCoordinate = Autodesk.Civil.LinearUnitType.Foot;// 30; _Elevation = Autodesk.Civil.LinearUnitType.Foot;// 30; _Area = Autodesk.Civil.AreaUnitType.SquareFoot; //56; _Volume = Autodesk.Civil.VolumeUnitType.CubicYard;// 153; _Speed = Autodesk.Civil.SpeedUnitType.MilePerHour;// 196; _Angle = Autodesk.Civil.AngleUnitType.Degree;// 179; _Direction = Autodesk.Civil.AngleUnitType.Degree;// 179; _LatLong = Autodesk.Civil.AngleUnitType.Degree;// 179; _Grade = Autodesk.Civil.GradeFormatType.Percent;// 2467; _Slope = Autodesk.Civil.SlopeFormatType.RunRise;// 2466; _GradeSlope = Autodesk.Civil.GradeSlopeFormatType.Percent;// 2467; _Station = Autodesk.Civil.LinearUnitType.Foot;// 2; _Acceleration = Autodesk.Civil.AccelerationUnitType.FootPerSecSquared;// 203; _Pressure = Autodesk.Civil.PressureUnitType.PoundPerSquareInch;// 242; tr.Commit(); } } } }}Собственно, как я понял параметры чертежа берутся из конструкции
--- Код - C# [Выбрать] --- CivilDocument c3d_doc = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument; var Units_Window = c3d_doc.Settings.DrawingSettings;
А стандартное обращение к чертежу здесь получается что-ли не к месту (кроме транзакции которая делается через Database)
--- Код - C# [Выбрать] --- Document m_Doc = Application.DocumentManager.MdiActiveDocument; Database db = m_Doc.Database;
Такое дело возвращает собственно "ноль" при выполнении его в среде Dynamo:
Примечание: Входное условие "bool condition_meters" нужно для логичного вписывания метода в структуру Dynamo
Ниже, собственно, другой метод который получает этот параметр:
--- Код - C# [Выбрать] --- public static bool CheckDrawingUnitsToEqualMeter(string Project_Units_str) { bool condition_meters; if (Project_Units_str == "Feet") condition_meters = false; else condition_meters = true; return condition_meters; }
Александр Ривилис:
Georg,
Пять раз перечитал, но так и не понял в чем вопрос.
Georg:
Тогда, сформулирую проще - как сделать так, чтобы метод работал?
Чтобы изменения сделанные в теле IF записывались в чертеж?
И корректно ли вообще переназначать так значения системных параметров чертежа - сомнения мучают ... смотреть через Units_Window.UnitZoneSettings..., а менять через Autodesk.Civil.Settings
Александр Ривилис:
--- Цитата: Georg от 04-11-2020, 17:06:21 ---_DrawingUnits = Autodesk.Civil.Settings.DrawingUnitType.Feet; //30
--- Конец цитаты ---
Вместо
--- Код - C# [Выбрать] ---_DrawingUnits = Autodesk.Civil.Settings.DrawingUnitType.Feet; //30должно быть
--- Код - C# [Выбрать] ---Units_Window.UnitZoneSettings.DrawingUnits = Autodesk.Civil.Settings.DrawingUnitType.Feet; //30Ну и так далее. Ты же в своём коде просто меняешь значения переменных, а не свойства чертежа.
Georg:
Спасибо!
Да, проверил, работает теперь. Я, получается, лишь считывал значения системных параметров в переменные, которым менял значения а обратно не возвращал.
Есть еще пара вопросов по данной теме (хоть это и отходит от концепции "1 вопрос - одна тема"
1. Можно ли как-то оптимизировать (сократить) не используя в "да" и "нет" повторного вызова функций?
--- Код - C# [Выбрать] ---if (condition_meters == false) { using (Transaction tr = db.TransactionManager.StartTransaction()) { Units_Window.UnitZoneSettings.DrawingUnits = Autodesk.Civil.Settings.DrawingUnitType.Meters; //2 Units_Window.UnitZoneSettings.AngularUnits = Autodesk.Civil.AngleUnitType.Degree; //179 Units_Window.UnitZoneSettings.ImperialToMetricConversion = Autodesk.Civil.Settings.ImperialToMetricConversionType.InternationalFoot; //536870912; Units_Window.UnitZoneSettings.ScaleObjectsFromOtherDrawings = true; Units_Window.UnitZoneSettings.MatchAutoCADVariables = true; Units_Window.UnitZoneSettings.DrawingScale = 1.0;// 1.0 Units_Window.AmbientSettings.General.DrivingDirection.Value = Autodesk.Civil.DrivingDirectionType.RightSideOfTheRoad;// 0; Units_Window.AmbientSettings.Time.Unit.Value = Autodesk.Civil.TimeUnitType.Minute;//301; Units_Window.AmbientSettings.Distance.Unit.Value = Autodesk.Civil.LinearUnitType.Meter;// 2; Units_Window.AmbientSettings.Dimension.Unit.Value = Autodesk.Civil.LinearUnitType.Meter;// 2; Units_Window.AmbientSettings.Coordinate.Unit.Value = Autodesk.Civil.LinearUnitType.Meter;// 2; Units_Window.AmbientSettings.GridCoordinate.Unit.Value = Autodesk.Civil.LinearUnitType.Meter; // 2; Units_Window.AmbientSettings.Elevation.Unit.Value = Autodesk.Civil.LinearUnitType.Meter; // 2; Units_Window.AmbientSettings.Area.Unit.Value = Autodesk.Civil.AreaUnitType.SquareMeter; //55; Units_Window.AmbientSettings.Volume.Unit.Value = Autodesk.Civil.VolumeUnitType.CubicMeter;// 96; Units_Window.AmbientSettings.Speed.Unit.Value = Autodesk.Civil.SpeedUnitType.KilometerPerHour;// 190; Units_Window.AmbientSettings.Angle.Unit.Value = Autodesk.Civil.AngleUnitType.Degree;// 179; Units_Window.AmbientSettings.Direction.Unit.Value = Autodesk.Civil.AngleUnitType.Degree;// 179; Units_Window.AmbientSettings.LatLong.Unit.Value = Autodesk.Civil.AngleUnitType.Degree;// 179; Units_Window.AmbientSettings.Grade.Format.Value = Autodesk.Civil.GradeFormatType.Decimal;// 2468; Units_Window.AmbientSettings.Slope.Format.Value = Autodesk.Civil.SlopeFormatType.RiseRun;// 2465; Units_Window.AmbientSettings.GradeSlope.Format.Value = Autodesk.Civil.GradeSlopeFormatType.Decimal;// 2468; Units_Window.AmbientSettings.Station.Unit.Value = Autodesk.Civil.LinearUnitType.Meter;// 2; Units_Window.AmbientSettings.Acceleration.Unit.Value = Autodesk.Civil.AccelerationUnitType.MeterPerSecSquared;// 202; Units_Window.AmbientSettings.Pressure.Unit.Value = Autodesk.Civil.PressureUnitType.Kilopascal;// 240; tr.Commit(); } } else { using (Transaction tr = db.TransactionManager.StartTransaction()) { Units_Window.UnitZoneSettings.DrawingUnits = Autodesk.Civil.Settings.DrawingUnitType.Feet; //30 Units_Window.UnitZoneSettings.AngularUnits = Autodesk.Civil.AngleUnitType.Degree; //179 Units_Window.UnitZoneSettings.ImperialToMetricConversion = Autodesk.Civil.Settings.ImperialToMetricConversionType.InternationalFoot; //536870912; Units_Window.UnitZoneSettings.ScaleObjectsFromOtherDrawings = false; Units_Window.UnitZoneSettings.MatchAutoCADVariables = false; Units_Window.UnitZoneSettings.DrawingScale = 1.0;// 1.0; ??? Units_Window.AmbientSettings.General.DrivingDirection.Value = Autodesk.Civil.DrivingDirectionType.RightSideOfTheRoad;// 0; Units_Window.AmbientSettings.Time.Unit.Value = Autodesk.Civil.TimeUnitType.Minute;//301; Units_Window.AmbientSettings.Distance.Unit.Value = Autodesk.Civil.LinearUnitType.Foot;// 30; Units_Window.AmbientSettings.Dimension.Unit.Value = Autodesk.Civil.LinearUnitType.Inch;// 31; Units_Window.AmbientSettings.Coordinate.Unit.Value = Autodesk.Civil.LinearUnitType.Foot;// 30; Units_Window.AmbientSettings.GridCoordinate.Unit.Value = Autodesk.Civil.LinearUnitType.Foot;// 30; Units_Window.AmbientSettings.Elevation.Unit.Value = Autodesk.Civil.LinearUnitType.Foot;// 30; Units_Window.AmbientSettings.Area.Unit.Value = Autodesk.Civil.AreaUnitType.SquareFoot; //56; Units_Window.AmbientSettings.Volume.Unit.Value = Autodesk.Civil.VolumeUnitType.CubicYard;// 153; Units_Window.AmbientSettings.Speed.Unit.Value = Autodesk.Civil.SpeedUnitType.MilePerHour;// 196; Units_Window.AmbientSettings.Angle.Unit.Value = Autodesk.Civil.AngleUnitType.Degree;// 179; Units_Window.AmbientSettings.Direction.Unit.Value = Autodesk.Civil.AngleUnitType.Degree;// 179; Units_Window.AmbientSettings.LatLong.Unit.Value = Autodesk.Civil.AngleUnitType.Degree;// 179; Units_Window.AmbientSettings.Grade.Format.Value = Autodesk.Civil.GradeFormatType.Percent;// 2467; Units_Window.AmbientSettings.Slope.Format.Value = Autodesk.Civil.SlopeFormatType.RunRise;// 2466; Units_Window.AmbientSettings.GradeSlope.Format.Value = Autodesk.Civil.GradeSlopeFormatType.Percent;// 2467; Units_Window.AmbientSettings.Station.Unit.Value = Autodesk.Civil.LinearUnitType.Foot;// 2; Units_Window.AmbientSettings.Acceleration.Unit.Value = Autodesk.Civil.AccelerationUnitType.FootPerSecSquared;// 203; Units_Window.AmbientSettings.Pressure.Unit.Value = Autodesk.Civil.PressureUnitType.PoundPerSquareInch;// 242; tr.Commit(); }Возможно, за это отвечает структура "this"? Я видел такие в чужих dll .. но не хватает пока скилла это применять
2. У меня идет обращение к Autodesk.Civil.Settings.DrawingUnitType.Feet, которое имеет численный код "30" - то есть я могу присваивать в отместку его а не директивами, а есть ли где-то открытый "кодификатор" этих чисел - ID параметров? Для упрощения в дальнейшем
Навигация
Перейти к полной версии