Revit Family Lab1 - Create Rectangular Column_CS
Family Lab1 - Create Rectangular Column_CS_번역.docx
이번 랩은 3가지 유형을 가진 간단한 직사각형 기둥 패밀리를 제작하는 과정입니다.
1. 외부명령을 정의
2. 패밀리를 제작할수 있는 문서의 유효성을 확인
3. 직사각형 솔리드모델을 생성
4. 기준면에 면을 정렬
5. 기둥패밀리의 유형을 추가하기
기둥패밀리의 "Metric Column.rft"을 열어야 실행이 가능합니다.
Class
RvtCmd_FamilyCreateColumnRectangle - 직사각형 기둥패밀리를 만드는 클래스
Field
RvApp - 응용프로그램의 멤버변수
RvDoc - 작업하는 문서의 멤버변수
Method
// IExternalCommand 함수를 상속받아서 클래스를 시작하기
Execute(ExternalCommandData, string, ElementSet)
// Metric Column.rft 템플릿 파일에서 작업하는 확인하기
isRightTemplate (BuiltInCategory)
// 직사각형 기둥에 해당하는 솔리드 모델 만들기
createSolid ()
// mm단위로 입력된 값을 피트단위로 변경
mmToFeet(double) // 도움함수
// 직사각형 프로파일 만들기
createProfileRectangle ()
// mm단위로 입력된 값을 피트단위로 변경
mmToFeet(double) // 도움함수
// 생성된 솔리드의 면을 참조면에 맟추어서 정렬
addAlignments (Extrusion)
// 객체의 기준좌표와 일치하는 면을 찾기
findFace(Extrusion, XYZ) // 도움함수
// 해당되는 타입의 뷰이름과 일치하는 요소를 찾기
findElement(Type, string) // 도움함수
// 기둥의 크기에 대한 유형을 입력하기
addTypes ()
// 미적용: 유형이름, 폭, 너비를 입력받아 새로운 유형을 만들기
addType (string, double, double)
참고함수
using System; using System.Collections.Generic; using System.Linq; // in System.Core using Autodesk.Revit; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Revit.ApplicationServices; namespace FamilyCs { [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Automatic)] // 메소드 구문: IExternalCommand의 값을 상속받는 클래스 시작 class RvtCmd_FamilyCreateColumnRectangle : IExternalCommand { // 멤버 변수명 정의 Application RvApp; Document RcDoc; // 구문의 시작 public Result Execute(ExternalCommandData commandData,ref string message,ElementSet elements) { // commandData의 값을 이용하여 멤버변수에 값을 입력 RvApp = commandData.Application.Application; RcDoc = commandData.Application.ActiveUIDocument.Document; // 기둥패밀리 작업을 시작할수있는 문서인지 확인하기 Metric Column.rft 파일인지 체크함. if (!isRightTemplate(BuiltInCategory.OST_Columns)) { Util.ErrorMsg("Please open Metric Column.rft"); return Result.Failed; } // 직사가형 기둥에 해당하는 솔리드 모델 만들기 Extrusion pSolid = createSolid(); // 입력된 형상을 다시 생성하기 RcDoc.Regenerate(); // 생성된 솔리드의 면을 참조면에 맟추어서 정렬 addAlignments(pSolid); // 기둥의 크기에 대한 유형을 입력하기 addTypes(); return Result.Succeeded; } // 패밀리 문맥인지 카테고리가 기둥인 체크하기 bool isRightTemplate(BuiltInCategory targetCategory) { // 패밀리 편집기 문서인지 확인 if (!RcDoc.IsFamilyDocument) { Util.ErrorMsg("This command works only in the family editor."); return false; } // 주어진 카테고리값을 cst 변수에 입력 Category cat = RcDoc.Settings.Categories.get_Item(targetCategory); // 패밀리 구문인지 확인 if (RcDoc.OwnerFamily == null) { Util.ErrorMsg("This command only works in the family context."); return false; } // 입력된 카테고리 상태를 체크 if (!cat.Id.Equals(RcDoc.OwnerFamily.FamilyCategory.Id)) { Util.ErrorMsg("Category of this family document does not match the context required by this command."); return false; } // 체크사항에 정상이면 true을 리턴함. return true; } // 메소드 구문: 직사각형 기둥에 해당하는 솔리드 모델 만들기 Extrusion createSolid() { // 직사각형의 프로파일 만들기 CurveArrArray pProfile = createProfileRectangle(); // 기둥 탬플릿의 하부레벨 참조평면 가져오기 ReferencePlane pRefPlane = findElement(typeof(ReferencePlane), "Reference Plane") as ReferencePlane; // 하부레벨 참조평면을 작업레벨로 스케치평면 설정하기 SketchPlane pSketchPlane = SketchPlane.Create( RcDoc, pRefPlane.Plane ); // 돌출시킬 높이값 설정 double dHeight = mmToFeet(4000.0); // 입력된 프로파일을 솔리드모델로 돌출 bool bIsSolid = true; return RcDoc.FamilyCreate.NewExtrusion(bIsSolid, pProfile, pSketchPlane, dHeight); } // 메소드 구문: 미적용: 직사각형 프로파일 만들기 CurveArrArray createProfileRectangle() { // 프로파일 거리값을 설정 double w = mmToFeet(600.0); double d = mmToFeet(600.0); // 프로파일의 정점을 정의 const int nVerts = 4; //4개 선형을 그리기 위한 반복횟수 설정 XYZ[] pts = new XYZ[] { new XYZ(-w / 2.0, -d / 2.0, 0.0), new XYZ(w / 2.0, -d / 2.0, 0.0), new XYZ(w / 2.0, d / 2.0, 0.0), new XYZ(-w / 2.0, d / 2.0, 0.0), new XYZ(-w / 2.0, -d / 2.0, 0.0) }; // 정점을 잇는 CurveArray 설정 CurveArray pLoop = RvApp.Create.NewCurveArray(); for (int i = 0; i < nVerts; ++i) { Line line = Line.CreateBound( pts[i], pts[i + 1] ); pLoop.Append(line); } // CurveArray값을 프로파일의 CurveArrArray 입력 CurveArrArray pProfile = RvApp.Create.NewCurveArrArray(); pProfile.Append(pLoop); // 형성된 프로파일을 리턴 return pProfile; } // 메소드 구문: 생성된 솔리드의 면을 참조면에 맟추어서 정렬 void addAlignments(Extrusion pBox) { // 솔리드의 상부면 정렬하기 // 정면 뷰 가져오기 View pView = findElement(typeof(View), "Front") as View; // 상부레벨 가져와서 참조평면으로 설정하여 ref1에 입력 Level upperLevel = findElement(typeof(Level), "Upper Ref Level") as Level; Reference ref1 = upperLevel.PlaneReference; // 솔리드 모델의 상부면을 가져와서 참조로 설정하고 ref2에 입력 PlanarFace upperFace = findFace(pBox, new XYZ(0.0, 0.0, 1.0)); // Z값이 상부인 면 찾기 Reference ref2 = upperFace.Reference; // 정면뷰에서 ref2면을 ref1에 정렬시킴 RcDoc.FamilyCreate.NewAlignment(pView, ref1, ref2); // 솔리드의 하부면 정렬하기 // 하부레벨 가져와서 참조평면으로 설정하여 ref3에 입력 Level lowerLevel = findElement(typeof(Level), "Lower Ref. Level") as Level; Reference ref3 = lowerLevel.PlaneReference; // 솔리드 모델의 하부면을 가져와서 참조로 설정하고 ref4에 입력 PlanarFace lowerFace = findFace(pBox, new XYZ(0.0, 0.0, -1.0)); // Z값이 하부인 면 찾기 Reference ref4 = lowerFace.Reference; // 정면뷰에서 ref4면을 ref3에 정렬시킴 RcDoc.FamilyCreate.NewAlignment(pView, ref3, ref4); // 하부평면 뷰 가져오기 View pViewPlan = findElement(typeof(ViewPlan), "Lower Ref. Level") as View; // 측면의 정렬시킬 참조평면 4개 변수 설정 - 기본제공 ReferencePlane refRight = findElement(typeof(ReferencePlane), "Right") as ReferencePlane; ReferencePlane refLeft = findElement(typeof(ReferencePlane), "Left") as ReferencePlane; ReferencePlane refFront = findElement(typeof(ReferencePlane), "Front") as ReferencePlane; ReferencePlane refBack = findElement(typeof(ReferencePlane), "Back") as ReferencePlane; // 솔리드 모델의 각각의 측면을 변수에 입력 PlanarFace faceRight = findFace(pBox, new XYZ(1.0, 0.0, 0.0)); PlanarFace faceLeft = findFace(pBox, new XYZ(-1.0, 0.0, 0.0)); PlanarFace faceFront = findFace(pBox, new XYZ(0.0, -1.0, 0.0)); PlanarFace faceBack = findFace(pBox, new XYZ(0.0, 1.0, 0.0)); // 하부평면 뷰에서 솔리드의 각가의 측면을 해당하는 참조평면에 정렬시킴 RcDoc.FamilyCreate.NewAlignment(pViewPlan, refRight.Reference, faceRight.Reference); RcDoc.FamilyCreate.NewAlignment(pViewPlan, refLeft.Reference, faceLeft.Reference); RcDoc.FamilyCreate.NewAlignment(pViewPlan, refFront.Reference, faceFront.Reference); RcDoc.FamilyCreate.NewAlignment(pViewPlan, refBack.Reference, faceBack.Reference); } // 메소드 구문: 기둥의 크기에 대한 유형을 입력하기 void addTypes() { // addType(name, Width, Depth) addType("600x900", 600.0, 900.0); addType("1000x300", 1000.0, 300.0); addType("600x600", 600.0, 600.0); } // 메소드 구문: 유형이름, 폭, 너비를 입력받아 새로운 유형을 만들기 void addType(string name, double w, double d) { // 현재문서에서 family manager를 가져와서 변수에 입력하기 FamilyManager pFamilyMgr = RcDoc.FamilyManager; // 주어진 이름으로 새로운 타입을 추가하여 type1 변수에 저장 FamilyType type1 = pFamilyMgr.NewType(name); // paramW에 'Width'를 설정하고 주어진 값을 입력 FamilyParameter paramW = pFamilyMgr.get_Parameter("Width"); double valW = mmToFeet(w); if (paramW != null) { pFamilyMgr.Set(paramW, valW); } // paramD에 'Depth'를 설정하고 주어진 값을 입력 FamilyParameter paramD = pFamilyMgr.get_Parameter("Depth"); double valD = mmToFeet(d); if (paramD != null) { pFamilyMgr.Set(paramD, valD); } } // 메소드 구문: 도움함수: 객체의 기준좌표와 일치하는 면을 찾기 PlanarFace findFace(Extrusion pBox, XYZ normal) { // 주어진 요소의 형상객체를 가져와서 geomElem변수에 저장 Options op = new Options(); op.ComputeReferences = true; GeometryElement geomElem = pBox.get_Geometry(op); // 반복구문을 이용하여 주어진 기준점과 일치하는 면을 찾기 foreach (GeometryObject geomObj in geomElem) { if (geomObj is Solid) // geomObj의 객체가 solid이면 아래의 구문 실행 { Solid pSolid = geomObj as Solid; FaceArray faces = pSolid.Faces; foreach (Face pFace in faces) { PlanarFace pPlanarFace = pFace as PlanarFace; // 반복구문을 이용하여 선택된 면이 기준점과 일치하는 체크 if ((pPlanarFace != null) && pPlanarFace.Normal.IsAlmostEqualTo(normal)) { // 면을 찾았으면 면을 응답 return pPlanarFace; } } } // 필요에 따라서 나중에 사용이 될수 있는 구문 - 참조용 //else if (geomObj is Instance) //{ //} //else if (geomObj is Curve) //{ //} //else if (geomObj is Mesh) //{ //} } // 찾지못하였으면 null을 응답 return null; } // 메소드 구문: 도움함수: 해당되는 타입의 뷰이름과 일치하는 요소를 찾기 Element findElement(Type targetType, string targetName) { // 주어진 타입의 컬랙션을 가져와서 collector변수에 저장 FilteredElementCollector collector = new FilteredElementCollector(RcDoc); collector.WherePasses(new ElementClassFilter(targetType)); // collector에서 주어진 이름과 동일한 요소를 가져와서 elems면수에 저장 - LINQ 쿼리를 사용 var targetElems = from element in collector where element.Name.Equals(targetName) select element; Listelems = targetElems.ToList (); // 주어진 이름으로 한개가 있으면 요소를 응답 if (elems.Count > 0) { return elems[0]; } // 요소 찾지 못하였으면 null을 응답 return null; } // 메소드 구문: 도움함수: mm단위로 입력된 값을 피트단위로 변경 double mmToFeet(double mmVal) { return mmVal / 304.8; } // 메소드 구문: 참고함수: findElement함수를 public으로 등록하여 사용 public static Element FindElement( Document doc, Type targetType,string targetName ) { // 주어진 문서에서 주어진 타입의 컬랙션을 가져와서 collector변수에 저장 FilteredElementCollector collector = new FilteredElementCollector( doc ); collector.WherePasses( new ElementClassFilter( targetType )); // collector에서 주어진 이름과 동일한 요소를 가져와서 elems면수에 저장 - LINQ 쿼리를 사용 IEnumerable targetElems = from element in collector where element.Name.Equals( targetName )select element; IList elems = targetElems.ToList(); // 주어진 이름으로 한개가 있으면 요소를 응답 if( elems.Count > 0 ) { return elems[0]; } // 요소 찾지 못하였으면 null을 응답 return null; } } }
'Revit > Revit API' 카테고리의 다른 글
[레빗 API 시작하기] Revit Family Lab3 - Add Formula and Material_CS (0) | 2014.01.08 |
---|---|
[레빗 API 시작하기] Revit Family Lab2 - Create L-Shape Column_CS (0) | 2014.01.08 |
[레빗 API 시작하기] Revit Ui Lab4 - Event (0) | 2014.01.08 |
[레빗 API 시작하기] Revit Ui Lab3 - TaskDialog (0) | 2014.01.08 |
[레빗 API 시작하기] Revit Ui Lab2 - Selection (0) | 2014.01.08 |