private void btn_action_Click(object sender, EventArgs e) { // kết nối với model đang hiện hành. tsm.Model model = new tsm.Model(); if (!model.GetConnectionStatus()) { MessageBox.Show("Tekla is not connected!! @@"); return; } // kiểm tra xem đã kết nối được với model chưa. //-------------------------------- // Nhặt 2 đối tượng Rebar group tsm.RebarGroup rebargroup0 = null; tsm.RebarGroup rebargroup1 = null; // Khởi tạo picker mui.Picker picker = new mui.Picker(); string mess = ""; while (rebargroup0 == null & rebargroup1 == null) { try { tsm.ModelObject obj0 = picker.PickObject(mui.Picker.PickObjectEnum.PICK_ONE_OBJECT, mess + "pick a group Rebar 0"); if (obj0 as tsm.RebarGroup != null) { rebargroup0 = obj0 as tsm.RebarGroup; mess = ""; } else { mess = "Object is not a Rebar group. "; } tsm.ModelObject obj1 = picker.PickObject(mui.Picker.PickObjectEnum.PICK_ONE_OBJECT, mess + "pick a group Rebar 1"); if (obj1 as tsm.RebarGroup != null) { rebargroup1 = obj1 as tsm.RebarGroup; mess = ""; } else { mess = "Object is not a Rebar group. "; } } catch { Operation.DisplayPrompt("not select"); return; } } }
public override bool checkModelObjects(_Mark other) { TSM.RebarGroup part1 = _part as TSM.RebarGroup; TSM.RebarGroup part2 = other._part as TSM.RebarGroup; T3D.Point p1start = __GeometryOperations.factor1Point(part1.StartPoint, _view as TSD.View); T3D.Point p1end = __GeometryOperations.factor1Point(part1.EndPoint, _view as TSD.View); T3D.Point p2start = __GeometryOperations.factor1Point(part2.StartPoint, other._view as TSD.View); T3D.Point p2end = __GeometryOperations.factor1Point(part2.EndPoint, other._view as TSD.View); if (!__GeometryOperations.compare2Points(p1start, p2start)) { return(false); } if (!__GeometryOperations.compare2Points(p1end, p2end)) { return(false); } ArrayList polygon1 = part1.Polygons; ArrayList polygon2 = part2.Polygons; if (polygon1.Count != polygon2.Count) { return(false); } for (int i = 0; i < polygon1.Count; i++) { TSM.Polygon poly1 = polygon1[i] as TSM.Polygon; TSM.Polygon poly2 = polygon2[i] as TSM.Polygon; ArrayList points1 = poly1.Points; ArrayList points2 = poly2.Points; ArrayList transformed1 = __GeometryOperations.factorPointArray(points1, _view as TSD.View); ArrayList transformed2 = __GeometryOperations.factorPointArray(points2, other._view as TSD.View); if (!__GeometryOperations.comparePointArray(transformed1, transformed2)) { return(false); } } return(true); }
static private void ungroupRebar(TSM.RebarGroup current) { ArrayList currentPolygons = current.GetRebarGeometries(true); foreach (TSM.RebarGeometry geo in currentPolygons) { TSM.Polygon poly = new TSM.Polygon(); PolyLine line = geo.Shape; ArrayList points = line.Points; poly.Points = points; SingleRebar single = new SingleRebar(); single.Polygon = poly; single.Father = current.Father; single.Name = current.Name; single.Class = current.Class; single.Size = current.Size; single.Grade = current.Grade; single.RadiusValues = current.RadiusValues; single.NumberingSeries.StartNumber = current.NumberingSeries.StartNumber; single.NumberingSeries.Prefix = current.NumberingSeries.Prefix; single.OnPlaneOffsets = new ArrayList(); single.OnPlaneOffsets.Add(0.0); single.StartHook.Angle = -90; single.StartHook.Length = 10; single.StartHook.Radius = 10; single.StartHook.Shape = RebarHookData.RebarHookShapeEnum.NO_HOOK; single.EndHook.Angle = 90; single.EndHook.Length = 10; single.EndHook.Radius = 10; single.EndHook.Shape = RebarHookData.RebarHookShapeEnum.NO_HOOK; single.Insert(); } current.Delete(); MessageBox.Show(currentPolygons.Count.ToString()); }
public override bool Run(List <InputDefinition> Input) { try { GetvaluesFormDialog(); var identifien1 = (Identifier)Input[0].GetInput(); var identifien2 = (Identifier)Input[1].GetInput(); var object1 = new tsm.Model().SelectModelObject(identifien1) as tsm.ModelObject; var object2 = new tsm.Model().SelectModelObject(identifien2) as tsm.ModelObject; //------------------------------------------------------------------------- tsm.RebarGroup rebargroup0 = null; tsm.RebarGroup rebargroup1 = null; while (rebargroup0 == null & rebargroup1 == null) { try { tsm.ModelObject obj0 = object1; if (obj0 as tsm.RebarGroup != null) { rebargroup0 = obj0 as tsm.RebarGroup; r0 = Double.Parse(rebargroup0.Size); sol0 = rebargroup0.GetSolid(); maxx0 = sol0.MaximumPoint.X; maxy0 = sol0.MaximumPoint.Y; maxz0 = sol0.MaximumPoint.Z; minx0 = sol0.MinimumPoint.X; miny0 = sol0.MinimumPoint.Y; minz0 = sol0.MinimumPoint.Z; } tsm.ModelObject obj1 = object2; if (obj1 as tsm.RebarGroup != null) { rebargroup1 = obj1 as tsm.RebarGroup; r1 = Double.Parse(rebargroup1.Size); onplan0 = Double.Parse(rebargroup1.OnPlaneOffsets[0].ToString()); sol1 = rebargroup1.GetSolid(); maxx1 = sol1.MaximumPoint.X; maxy1 = sol1.MaximumPoint.Y; maxz1 = sol1.MaximumPoint.Z; minx1 = sol1.MinimumPoint.X; miny1 = sol1.MinimumPoint.Y; minz1 = sol1.MinimumPoint.Z; } if (r0 >= r1) { r = r1; } else { r = r0; } if (_Combo_Spacing == "Auto") { if (r == 12 || r == 14) { _Spacing = r + 2; } else if (r == 8 || r == 10 || r > 14 & r <= 12) { _Spacing = r + 3; } else if (r == 25) { _Spacing = r + 4; } else { _Spacing = r + 5; } } //------------------------------------------------------------------ poly0.Points.Add(new g3d.Point(minx0, maxy0 - r / 2, maxz0 - r / 2)); poly0.Points.Add(new g3d.Point(maxx0 - _LapLenght * r - _CrankRatio * r - 50, maxy0 - r / 2, maxz0 - r / 2)); poly0.Points.Add(new g3d.Point(maxx0 - _LapLenght * r - 50, maxy0 - r / 2, maxz0 - r / 2 - _Spacing)); poly0.Points.Add(new g3d.Point(maxx0, maxy0 - r / 2, maxz0 - r / 2 - _Spacing)); poly1.Points.Add(new g3d.Point(maxx0 - _LapLenght * r, maxy1 - r / 2, maxz1 - r / 2)); poly1.Points.Add(new g3d.Point(maxx1, maxy1 - r / 2, maxz1 - r / 2)); //------------------------------------------------------------------- //end tạo điểm polygon rebargroup0.Polygons.Clear(); rebargroup0.Polygons.Add(poly0); rebargroup0.OnPlaneOffsets.Clear(); rebargroup0.OnPlaneOffsets.Add(0.0); rebargroup0.Modify(); rebargroup1.Polygons.Clear(); rebargroup1.Polygons.Add(poly1); rebargroup1.OnPlaneOffsets.Clear(); rebargroup1.OnPlaneOffsets.Add(0.0); rebargroup1.Modify(); } catch (Exception) { throw; } } } catch (Exception) { throw; } return(true); }
//InterSectionTest 3 private void button4_Click(object sender, EventArgs e) { //부재 선택 Picker picker = new Picker(); TSM.Part part = picker.PickObject(Picker.PickObjectEnum.PICK_ONE_OBJECT, "철근형태를 수정할 부재를 선택하세요.") as TSM.Part; TSM.Part intersectingpart = picker.PickObject(Picker.PickObjectEnum.PICK_ONE_OBJECT, "간섭하는 부재를 선택하세요.") as TSM.Part; //Intersection 처리 double partFrontLength = 0.0; double intersectionLength = 0.0; //할당해야함 TSG.OBB iPartOBB = CreateOrientedBoundingBox(intersectingpart); TSG.Vector partLVector = new TSG.Vector(); if (part.GetType().Name == "Beam") { TSM.Beam beam = part as TSM.Beam; TSG.LineSegment lineSegment = new TSG.LineSegment(beam.StartPoint, beam.EndPoint); TSG.Point firstPoint = TSG.Intersection.LineSegmentToObb(lineSegment, iPartOBB).Point1; TSG.Point secondPoint = TSG.Intersection.LineSegmentToObb(lineSegment, iPartOBB).Point2; partFrontLength = TSG.Distance.PointToPoint(beam.StartPoint, firstPoint); intersectionLength = TSG.Distance.PointToPoint(firstPoint, secondPoint); partLVector = new TSG.Vector(beam.EndPoint - beam.StartPoint).GetNormal(); } else if (part.GetType().Name == "ContourPlate") //ContourPlate인 경우 추후 작성 { TSM.ContourPlate contourPlate = part as TSM.ContourPlate; } //철근 그룹화 해제 후 singleRebar 저장 ModelObjectEnumerator reinforcement = part.GetReinforcements(); List <TSM.SingleRebar> singleRebars = new List <TSM.SingleRebar>(); List <TSM.SingleRebar> group = new List <TSM.SingleRebar>(); //그룹화를 위한 List int rebarCount = 0; //총 단일철근 수량 ArrayList rebarInterval = new ArrayList(); //철근 간격 (싱글 타입일 때는 철근 간격을 어떻게 구하지? > 일단 PASS) while (reinforcement.MoveNext()) { if (reinforcement.Current.GetType().Name == "SingleRebar") //부재에 속한 철근이 SingleRebar타입일 때 { TSM.SingleRebar singleRebar = reinforcement.Current as TSM.SingleRebar; singleRebars.Add(singleRebar); MessageBox.Show("SingleRebar 타입은 현재 지원 불가"); } else //부재에 속한 철근이 RebarGroup타입일 때 { TSM.RebarGroup rebarGroup = reinforcement.Current as TSM.RebarGroup; rebarInterval = rebarGroup.Spacings; //철근 간격 저장 TSM.ModelObjectEnumerator rebarEnumerator = TSM.Operations.Operation.Ungrouping(rebarGroup); while (rebarEnumerator.MoveNext()) { TSM.ModelObject rebar = rebarEnumerator.Current; TSM.SingleRebar singleRebar = rebar as TSM.SingleRebar; singleRebars.Add(singleRebar); } } rebarCount = singleRebars.Count; // 총 단일수량 저장 } //철근 재배치 for (int i = 0; i < singleRebars.Count - (intersectionLength / (double)rebarInterval[0]); i++) // 딱 안떨어지는 경우 고려해줘야함 { double frontLength = (i * (double)rebarInterval[0]); if (frontLength >= partFrontLength) { if (i == singleRebars.Count) { break; } else { for (int j = 0; j < singleRebars[i].Polygon.Points.Count; j++) { TSM.SingleRebar newSingleRebar = singleRebars[i]; TSG.Point intersectionLengthPoint = new TSG.Point(intersectionLength * partLVector.X, intersectionLength * partLVector.Y, intersectionLength * partLVector.Z); newSingleRebar.Polygon.Points[j] = newSingleRebar.Polygon.Points[j] as TSG.Point + intersectionLengthPoint; singleRebars[i].Delete(); newSingleRebar.Insert(); group.Add(newSingleRebar); } } } else { group.Add(singleRebars[i]); } } for (int i = singleRebars.Count - (int)(intersectionLength / (double)rebarInterval[0]); i < singleRebars.Count; i++) { singleRebars[i].Delete(); } TSM.RebarGroup newRebarGroup = TSM.Operations.Operation.Group(group); }
//InterSectionTest 2 private void button1_Click_1(object sender, EventArgs e) { //부재 선택 Picker picker = new Picker(); TSM.ModelObject part = picker.PickObject(Picker.PickObjectEnum.PICK_ONE_OBJECT, "부재를 선택하세요.") as TSM.ModelObject; TSM.ContourPlate contourPlate = part as TSM.ContourPlate; Solid solid = contourPlate.GetSolid(); //철근 정보 받기 //철근 선택 및 그룹철근 분할 ModelObjectEnumerator reinforcement = contourPlate.GetReinforcements(); List <TSM.SingleRebar> singleRebars = new List <TSM.SingleRebar>(); List <TSM.SingleRebar> group = new List <TSM.SingleRebar>(); //수정안된 철근 while (reinforcement.MoveNext()) { if (reinforcement.Current.GetType().Name == "SingleRebar") { TSM.SingleRebar singleRebar = reinforcement.Current as TSM.SingleRebar; singleRebars.Add(singleRebar); } else { TSM.RebarGroup rebarGroup = reinforcement.Current as TSM.RebarGroup; TSM.ModelObjectEnumerator rebarEnumerator = TSM.Operations.Operation.Ungrouping(rebarGroup); while (rebarEnumerator.MoveNext()) { TSM.ModelObject rebar = rebarEnumerator.Current; TSM.SingleRebar singleRebar = rebar as TSM.SingleRebar; singleRebars.Add(singleRebar); } } } //Intersect (마구리와 철근 겹치는 부분을 철근의 새 포인트로 지정한다.) TSG.LineSegment rebarLineSegment = null; ArrayList intersectLinesegment = new ArrayList(); for (int j = 0; j < singleRebars.Count; j++) //철근 선택 반복문 { TSG.Point point1 = singleRebars[j].Polygon.Points[0] as TSG.Point; TSG.Point point2 = singleRebars[j].Polygon.Points[1] as TSG.Point; TSM.SingleRebar newSingleRebar = singleRebars[j]; if (singleRebars[j].Polygon.Points.Count == 2) //직선철근일때 { rebarLineSegment = new TSG.LineSegment(point1, point2); } intersectLinesegment = solid.Intersect(rebarLineSegment); newSingleRebar.Polygon.Points[0] = intersectLinesegment[0] as TSG.Point; newSingleRebar.Polygon.Points[1] = intersectLinesegment[1] as TSG.Point; singleRebars[j].Delete(); newSingleRebar.Insert(); if (newSingleRebar.Polygon.Points[0] as TSG.Point == point1 && newSingleRebar.Polygon.Points[1] as TSG.Point == point2) { group.Add(newSingleRebar); } } TSM.RebarGroup nonmodifiedGroup = TSM.Operations.Operation.Group(group); }
//InterSectionTest 1 private void button3_Click(object sender, EventArgs e) { //기본 객체 생성 TSM.Part girder = null; TSM.Component component = new TSM.Component(); TSM.Part endPiece = null; List <TSM.ContourPlate> endPieceList = new List <TSM.ContourPlate>(); //1. 부재를 Input 으로 받는다. Picker picker = new Picker(); TSM.ModelObject part = picker.PickObject(Picker.PickObjectEnum.PICK_ONE_OBJECT, "부재를 선택하세요.") as TSM.ModelObject; if (part.GetType().Name == "Beam") //선택한 거더가 단일객체일 경우 { girder = part as TSM.Beam; endPiece = picker.PickObject(Picker.PickObjectEnum.PICK_ONE_OBJECT, "부재를 선택하세요.") as TSM.ContourPlate; //연장할 마구리를 직접 선택 //마구리 객체 OBB 생성 (추후 수정 - Girder 단일부재일 때도 마구리 1개이상 가능하므로) TSG.OBB obb = CreateOrientedBoundingBox(endPiece); //마구리 OBB 객체 생성 TSG.LineSegment rebarLineSegment = null; //철근 선택 및 그룹철근 분할 ModelObjectEnumerator reinforcement = girder.GetReinforcements(); List <TSM.SingleRebar> singleRebars = new List <TSM.SingleRebar>(); List <TSM.SingleRebar> group1 = new List <TSM.SingleRebar>(); //수정된 철근 List <TSM.SingleRebar> group2 = new List <TSM.SingleRebar>(); //수정안된 철근 while (reinforcement.MoveNext()) { if (reinforcement.Current.GetType().Name == "SingleRebar") //부재 내 철근이 SingleRebar타입일때 { TSM.SingleRebar singleRebar = reinforcement.Current as TSM.SingleRebar; singleRebars.Add(singleRebar); } else //부재 내 철근이 rebarGroup타입일때 { TSM.RebarGroup rebarGroup = reinforcement.Current as TSM.RebarGroup; TSM.ModelObjectEnumerator rebarEnumerator = TSM.Operations.Operation.Ungrouping(rebarGroup); while (rebarEnumerator.MoveNext()) { TSM.ModelObject rebar = rebarEnumerator.Current; TSM.SingleRebar singleRebar = rebar as TSM.SingleRebar; singleRebars.Add(singleRebar); } } } for (int j = 0; j < singleRebars.Count; j++) //철근 선택 반복문 { TSG.Point rebarStartPoint = singleRebars[j].Polygon.Points[0] as TSG.Point; TSG.Point rebarEndPoint = singleRebars[j].Polygon.Points[1] as TSG.Point; TSM.SingleRebar newSingleRebar = singleRebars[j]; //기존 철근을 삭제하고 형태가 변형된 새 철근 삽입 if (singleRebars[j].Polygon.Points.Count == 2) //직선철근일때 { rebarLineSegment = new TSG.LineSegment(rebarStartPoint, rebarEndPoint); } TSG.LineSegment intersectLine = TSG.Intersection.LineSegmentToObb(rebarLineSegment, obb); //만나는 점이 하나일 때 output 형태 > 두 점이 같은지점으로 찍힘 if (intersectLine != null) // 철근과 마구리가 만날때 / 한 점만 만날때는 Linesegment의 point1 과 point2 가 같은 값임 { //철근 선을 연장 rebarLineSegment = new TSG.LineSegment(rebarStartPoint, rebarEndPoint + new TSG.Point(0, 100000, 0)); //추후 수정( y방향이 아니라 철근의 진행방향으로) intersectLine = TSG.Intersection.LineSegmentToObb(rebarLineSegment, obb); //마구리 가까운쪽이 철근 Point1 인경우 if (intersectLine.Point1.Equals(intersectLine.Point2)) { rebarLineSegment = new TSG.LineSegment(rebarStartPoint + new TSG.Point(0, 100000, 0), rebarEndPoint); intersectLine = TSG.Intersection.LineSegmentToObb(rebarLineSegment, obb); newSingleRebar.Polygon.Points[0] = intersectLine.Point2; } else //마구리 가까운쪽이 철근 Point2 인경우 { newSingleRebar.Polygon.Points[1] = intersectLine.Point2; } singleRebars[j].Delete(); newSingleRebar.Insert(); group1.Add(newSingleRebar); } else { group2.Add(singleRebars[j]); //수정안된 철근들 그룹에 넣기 } TSM.RebarGroup modifiedGroup = TSM.Operations.Operation.Group(group1); TSM.RebarGroup nonmodifiedGroup = TSM.Operations.Operation.Group(group2); } } else if (part.ToString() == "Tekla.Structures.Model.Component") //선택한 거더가 컴포넌트일 경우 { component = part as TSM.Component; //반환된 Girder의 타입 결정 TSM.Assembly assembly = component.GetAssembly(); if (assembly.GetMainPart().GetType().Name == "Beam") { girder = assembly.GetMainPart() as TSM.Beam; } else if (assembly.GetMainPart().GetType().Name == "ContourPlate") { girder = assembly.GetMainPart() as TSM.ContourPlate; } // Input으로 받은 부재에 연결되어있는 마구리와 철근정보를 받아온다. //반환된 Secondaries의 타입 결정 endPieceList = new List <TSM.ContourPlate>(); for (int i = 0; i < assembly.GetSecondaries().Count; i++) { TSM.Part secondary = assembly.GetSecondaries()[i] as TSM.Part; if (secondary.Name == "EndPiece") { endPieceList.Add(secondary as TSM.ContourPlate); } } } }
private void btn_createRebar_Click(object sender, EventArgs e) { //철근 정보가 저장된 reabarInfo 클래스, 해당 클래스에는 반경 정보를 비롯한 철근의 정보들이 저장되어있어야함 //RebarInfo rebarInfo = new RebarInfo(); TSM.RebarGroup rebarGroup = new TSM.RebarGroup(); Picker picker = new Picker(); //부재선택 TSM.Beam fatherObject = picker.PickObject(Picker.PickObjectEnum.PICK_ONE_OBJECT, "철근을 삽입할 부재를 선택하세요.") as TSM.Beam; //철근 형태를 결정할 Point 선택 ArrayList shapePoints = picker.PickPoints(Picker.PickPointEnum.PICK_POLYGON, "철근 형태를 결정할 포인트를 선택하세요."); //철근 생성 위치를 결정할 Point 선택 //ArrayList locationPoints = picker.PickPoints(Picker.PickPointEnum.PICK_POLYGON, "철근 생성 위치를 결정할 포인트를 선택하세요."); TSM.Polygon polygon = new TSM.Polygon(); for (int i = 0; i < shapePoints.Count; i++) { polygon.Points.Add(shapePoints[i] as TSG.Point); } rebarGroup.Polygons.Add(polygon); //StartPoint와 EndPoint 중간에 또 값이 들어갈 수도 있는데 철근 생성위치 결정에서의 Polygon 대입을 어떻게 하는지 확인해봐야함 rebarGroup.Father = fatherObject; rebarGroup.StartPoint = new TSG.Point(500, 3500, 0); rebarGroup.EndPoint = new TSG.Point(500, 3500, 5000); //rebarGroup.StartPoint = (TSG.Point)locationPoints[0]; //rebarGroup.EndPoint = (TSG.Point)locationPoints[1]; //철근 기본정보 (추후 rebarInfo에서 로드) rebarGroup.Name = "MainRebar"; rebarGroup.Size = "13"; rebarGroup.Grade = "SD400"; rebarGroup.Class = 11; rebarGroup.RadiusValues.Add(60.00); //rebarGroup.NumberingSeries.Prefix = "GR"; //갈고리 설정 (추후 Form 컨트롤에 연동) rebarGroup.StartHook.Shape = RebarHookData.RebarHookShapeEnum.NO_HOOK; rebarGroup.EndHook.Shape = RebarHookData.RebarHookShapeEnum.NO_HOOK; //offset설정 (추후 Form 컨트롤에 연동) rebarGroup.OnPlaneOffsets.Add(0); rebarGroup.FromPlaneOffset = 0; rebarGroup.StartPointOffsetValue = 0; rebarGroup.EndPointOffsetValue = 0; //간격 배치방법 설정 (추후 Form 컨트롤에 연동) rebarGroup.SpacingType = TSM.BaseRebarGroup.RebarGroupSpacingTypeEnum.SPACING_TYPE_TARGET_SPACE; rebarGroup.Spacings.Add(0.0); rebarGroup.ExcludeType = BaseRebarGroup.ExcludeTypeEnum.EXCLUDE_TYPE_NONE; rebarGroup.StirrupType = RebarGroup.RebarGroupStirrupTypeEnum.STIRRUP_TYPE_POLYGONAL; bool result = false; result = rebarGroup.Insert(); if (result == false) { MessageBox.Show("insert Failed"); } }