Поворот на Пи
Вопрос: Я пытаюсь создать приложение, которое переведет модель из SolidWorks в Revit. Идея состоит в том, чтобы перерисовать модель SolidWorks в Revit.
Я столкнулся с очень странным поведением метода ElementTransformUtils.RotateElement, и мне интересно, сталкивались вы с этим или может у вас есть какие мысли по этому поводу. Я использую Revit 2012 и C#. Вот пример моего кода:
- Autodesk.Revit.Creation.Application creapp
- = fdoc.Application.Create;
- XYZ normal = XYZ.BasisZ;
- SketchPlane sketchPlane
- = CreateSketchPlane( normal, XYZ.Zero );
- XYZ p0 = XYZ.Zero;
- XYZ p1 = new XYZ( 10, 0, 0 );
- XYZ p2 = new XYZ( 10, 10, 0 );
- XYZ p3 = new XYZ( 0, 10, 0 );
- XYZ p4 = new XYZ( 10, 20, 0 );
- Line line1 = creapp.NewLineBound( p0, p1 );
- Line line2 = creapp.NewLineBound( p1, p2 );
- Line line3 = creapp.NewLineBound( p2, p3 );
- Line line4 = creapp.NewLineBound( p3, p0 );
- Line line5 = creapp.NewLineBound( p2, p4 );
- CurveArray curveArray1 = new CurveArray();
- curveArray1.Append( line1 );
- curveArray1.Append( line2 );
- curveArray1.Append( line3 );
- curveArray1.Append( line4 );
- CurveArrArray curveArrArray = new CurveArrArray();
- curveArrArray.Append( curveArray1 );
- Revolution aRevolution
- = fdoc.FamilyCreate.NewRevolution( true,
- curveArrArray, sketchPlane, line5,
- Math.PI / -2, 0 );
- // Следующий код не работает!
- ElementTransformUtils.RotateElement(
- fdoc, aRevolution.Id, line5, Math.PI );
Проблема в значении Math.PI, которое я использую в методе RotateElement. Я застрял в этом месте и такое чувство, что нельзя использовать значение, которое больше или равно значению числа π. В качестве решение я использую не само число π, а Math.PI * 0.995, что означает не совсем точный результат.
Буду рад любым советам.
Ответ: Вот такая реализация, основанная на вашем коде и адаптированная к Revit 2015 работает без проблем:
- [Transaction( TransactionMode.Manual )]
- public class Command : IExternalCommand
- {
- public Result Execute(
- ExternalCommandData commandData,
- ref string message,
- ElementSet elements )
- {
- UIApplication uiapp = commandData.Application;
- UIDocument uidoc = uiapp.ActiveUIDocument;
- Application app = uiapp.Application;
- Document doc = uidoc.Document;
- XYZ p0 = XYZ.Zero;
- XYZ p1 = new XYZ( 10, 0, 0 );
- XYZ p2 = new XYZ( 10, 10, 0 );
- XYZ p3 = new XYZ( 0, 10, 0 );
- XYZ p4 = new XYZ( 10, 20, 0 );
- Line line1 = Line.CreateBound( p0, p1 );
- Line line2 = Line.CreateBound( p1, p2 );
- Line line3 = Line.CreateBound( p2, p3 );
- Line line4 = Line.CreateBound( p3, p0 );
- Line line5 = Line.CreateBound( p2, p4 );
- CurveArray curveArray1 = new CurveArray();
- curveArray1.Append( line1 );
- curveArray1.Append( line2 );
- curveArray1.Append( line3 );
- curveArray1.Append( line4 );
- CurveArrArray curveArrArray = new CurveArrArray();
- curveArrArray.Append( curveArray1 );
- using( Transaction tx = new Transaction( doc ) )
- {
- tx.Start( "Поворот" );
- //XYZ normal = XYZ.BasisZ;
- //Plane plane = new Plane( normal, XYZ.Zero );
- //SketchPlane sketchPlane = SketchPlane.Create( doc, plane );
- SketchPlane sketchPlane
- = new FilteredElementCollector( doc )
- .OfClass( typeof( SketchPlane ) )
- .Cast<SketchPlane>()
- .Where<SketchPlane>( x
- => x.Name.Equals( "Ref. Level" ) )
- .FirstOrDefault<SketchPlane>();
- Revolution aRevolution
- = doc.FamilyCreate.NewRevolution(
- true, curveArrArray, sketchPlane,
- line5, Math.PI / -2, 0 );
- doc.Regenerate();
- ElementTransformUtils.RotateElement(
- doc, aRevolution.Id, line5, Math.PI ); // Работает без проблем!
- tx.Commit();
- }
- return Result.Succeeded;
- }
- }
Есть несколько отличий между 2012 и 2015 версией.
Я также поменял создание рабочей поверхности используя FilteredElementCollector.
Наиболее значительное изменение: я вызвал регенерацию документа перед тем как вызвать метод RotateElement.
Обратите внимание, что в качестве аргумента передается ElementId. Это знак того, что элемент должен существовать в базе данных Revit, которые появляется там только после регенерации.
Источник: http://thebuildingcoder.typepad.com/blog/2014/11/rotation-by-and-newsweptblend-using-arcs.html#2
Обсуждение: http://adn-cis.org/forum/index.php?topic=1708
Опубликовано 16.12.2014Отредактировано 16.12.2014 в 10:55:50