getPVI(ObjectId idAlign, double dblStation, ref List <POI> varpoi, double dblHeightCurb, ref bool boolNewPVI) { bool boolFound = false; Profile objProfileFLOWLINE = Prof.getProfile(idAlign, "FLOWLINE"); Profile objProfileSTAKE = Prof.getProfile(idAlign, "STAKE"); ProfilePVICollection objProfilePVIs = objProfileSTAKE.PVIs; double dblProfileElev = System.Math.Round(objProfileFLOWLINE.ElevationAt(dblStation) + dblHeightCurb / 12, 3); for (int i = 0; i <= objProfilePVIs.Count - 1; i++) { ProfilePVI objProfilePVI = objProfilePVIs[i]; if (Math.roundDown1((objProfilePVI.Station)) == Math.roundDown1(dblStation)) { objProfilePVI.Elevation = dblProfileElev; boolFound = true; break; } } if (boolFound) { for (int k = 0; k < varpoi.Count; k++) { if (varpoi[k].Station == Math.roundDown3(dblStation)) { check4GradeBreak(k, varpoi); } } boolFound = false; } else { boolNewPVI = true; ProfilePVI objProfilePVI = objProfilePVIs.AddPVI(dblStation, dblProfileElev); varpoi.Add(new POI { Station = Math.roundDown3(dblStation), Elevation = dblProfileElev, ClassObj = fStake.ClassObj }); var sortSta = from p in varpoi orderby p.Station select p; int j = 0; foreach (var p in sortSta) { j += 1; if (Math.roundDown3(dblStation) == p.Station) { check4GradeBreak(j, varpoi); break; } } } }
changeAlignStartPoint() { //BEGIN: UPDATE PROFILE, TABLE, AND POIs AlgnData algnData = new AlgnData(); ObjectId idAlign = ObjectId.Null; Alignment objAlign = null; if (selectAlignment(idAlign)) { objAlign = fStake.ACTIVEALIGN; } else { return; } objAlign = fStake.ACTIVEALIGN; AlignmentEntityCollection objAlignEnts = objAlign.Entities; //BEGIN: UPDATE PROFILE, TABLE, AND POIs double dblLenAlign = objAlign.Length; PromptStatus ps; Point3d varPnt = UserInput.getPoint("Select Desired Start Point", out ps, osMode: 0); double dblStation = 0, dblOffset = 0; idAlign.getAlignStaOffset(varPnt, ref dblStation, ref dblOffset); double dblStationStart = objAlign.StartingStation; double dblStationDelta = dblStation - dblStationStart; // if varPnt is out of range then dblStation returns ZERO Profile profFLOWLINE = Prof.getProfile(idAlign, "FLOwLINE"); ProfilePVICollection pvis = profFLOWLINE.PVIs; List <POI> varPOI_Temp = new List <POI>(); foreach (ProfilePVI pvi in pvis) { POI poi = new POI { Station = Math.roundDown3(pvi.Station), Elevation = pvi.Elevation }; varPOI_Temp.Add(poi); } Debug.Print("varPOI_Temp Before"); for (int i = 0; i < varPOI_Temp.Count; i++) { Debug.Print(varPOI_Temp[i].Station + " " + varPOI_Temp[i].Elevation); } //adjust POI_Temp stationing for (int i = 0; i < varPOI_Temp.Count; i++) { POI poi = varPOI_Temp[i]; if (poi.Station < dblStationDelta + dblStationStart) { poi.Station = Math.roundDown3(dblLenAlign + varPOI_Temp[i].Station); } else { poi.Station = Math.roundDown3(varPOI_Temp[i].Station - dblStationDelta); } varPOI_Temp[i] = poi; } List <POI> poiTmp = new List <POI>(); var sortPOI_Temp = from t in varPOI_Temp orderby t.Station ascending select t; foreach (var t in sortPOI_Temp) { poiTmp.Add(t); } varPOI_Temp = poiTmp; int k = varPOI_Temp.Count; POI poitemp = varPOI_Temp[k - 1]; poitemp.Elevation = varPOI_Temp[0].Elevation; varPOI_Temp[k] = poitemp; Debug.Print("varPOI_Temp After"); for (int i = 0; i < k; i++) { Debug.Print(varPOI_Temp[i].Station + " " + varPOI_Temp[i].Elevation); } //END: UPDATE PROFILE, TABLE, AND POIs ObjectId idPoly = objAlign.GetPolyline(); Polyline poly = (Polyline)idPoly.getEnt(); string strAlignName = objAlign.Name; AlgnData aData; for (int j = 1; j < fStake.algnData.Count; j++) { aData = fStake.algnData[j]; if (aData.AlignHandle == objAlign.Handle) { break; } } objAlign.ReferencePointStation = 100.0; foreach (AlignmentEntity ent in objAlignEnts) { objAlignEnts.Remove(ent); } List <Vertex2d> v2ds = Conv.poly_Vertex2dList(idPoly); int p = 0; foreach (Vertex2d v in v2ds) { if (v.Position.IsEqualTo(varPnt, new Tolerance(0, 0))) { break; } p++; } List <Vertex2d> v2dsNew = new List <Vertex2d>(); for (int i = p; i < v2ds.Count; i++) { v2dsNew.Add(v2ds[i]); } for (int i = 1; i < p; i++) { v2dsNew.Add(v2ds[i]); } v2dsNew.Add(v2ds[p]); int lngID = 0; Point3d dblPntBeg = Pub.pnt3dO, dblPntEnd = Pub.pnt3dO, dblPntMid = Pub.pnt3dO; for (int i = 1; i < v2dsNew.Count; i++) { if (v2dsNew[i].Bulge == 0) { dblPntBeg = v2dsNew[i - 1].Position; dblPntEnd = v2dsNew[i = 0].Position; AlignmentLine objAlignEntTan = objAlign.Entities.AddFixedLine(lngID, dblPntBeg, dblPntEnd); lngID = objAlignEntTan.EntityId; } else { dblPntBeg = v2dsNew[i - 1].Position; dblPntEnd = v2dsNew[i = 0].Position; int intDir = 0; if (v2dsNew[i - 1].Bulge > 0) { intDir = 1; } else { intDir = -1; } Arc arc = (Arc)Arc.Create(IntPtr.Zero, true); arc.StartPoint = dblPntBeg; arc.EndPoint = dblPntEnd; Point3d pnt3dMidLC = dblPntBeg.getMidPoint3d(dblPntEnd); double lenLC = dblPntBeg.getDistance(dblPntEnd); double dirLC = dblPntBeg.getDirection(dblPntEnd); double lenM = System.Math.Abs(lenLC / 2 * v2dsNew[i - 1].Bulge); dblPntMid = pnt3dMidLC.traverse(dirLC + System.Math.PI / 2 * intDir, lenM); AlignmentArc objAlignEntArc = objAlign.Entities.AddFixedCurve(lngID, dblPntBeg, dblPntMid, dblPntEnd); lngID = objAlignEntArc.EntityId; } } objAlign.Update(); objAlign.ReferencePoint = varPnt.Convert2d(BaseObjs.xyPlane); objAlign.ReferencePointStation = System.Math.Round(100.0 + dblStationDelta, 3); //BEGIN: UPDATE PROFILE, TABLE, AND POIs List <POI> varpoi = fStake.POI_CALC; //POIs are updated when selectAlignment is executed //ADJUST POI STATIONING //need complete POIs for descriptions for (int i = 0; i < varpoi.Count; i++) { if (varpoi[i].Station < dblStationDelta + dblStationStart) { varpoi[i].Station = Math.roundDown3(dblLenAlign + varpoi[i].Station); } else { varpoi[i].Station = Math.roundDown3(varpoi[i].Station - dblStationDelta); } } varpoi = varpoi.sortPOIbyStation(); int n = varpoi.Count; varpoi[0].DescX = "BEG " + varpoi[0].Desc0; varpoi[n - 2].DescX = varpoi[n - 2].DescX.Replace("END", "").Trim(); varpoi[n - 1].DescX = varpoi[n - 1].DescX.Replace("BEG", "END").Trim(); if (fStake.ClassObj == "CURB") { Stake_AddProfile.makeProfile(idAlign, varPOI_Temp, "CURB", "ByLayout", true); } ObjectId idTable = Stake_Table.makeTable(idAlign, varpoi); Stake_Table.addTableData(idTable, varpoi); if (Stake_GetBC_EC.getBC_EC(idAlign, ref varpoi) == false) { return; } fStake.POI_CALC = varpoi; //END: UPDATE PROFILE, TABLE, AND POIs }
public static void reverseAlign(ObjectId idAlign) { List <POI> varpoi = null; List <POI> varPOI_ORG = null; List <POI> varPOI_Temp = null; ProfilePVICollection objPVIs = null; string nameLayer = idAlign.getLayer(); TypedValue[] tvs = new TypedValue[9]; tvs.SetValue(new TypedValue((int)DxfCode.Operator, "<OR"), 0); tvs.SetValue(new TypedValue((int)DxfCode.Start, RXClass.GetClass(typeof(Polyline)).DxfName), 1); tvs.SetValue(new TypedValue((int)DxfCode.Start, RXClass.GetClass(typeof(Leader)).DxfName), 2); tvs.SetValue(new TypedValue((int)DxfCode.Start, RXClass.GetClass(typeof(DBText)).DxfName), 3); tvs.SetValue(new TypedValue((int)DxfCode.Start, RXClass.GetClass(typeof(MText)).DxfName), 4); tvs.SetValue(new TypedValue((int)DxfCode.Start, RXClass.GetClass(typeof(Circle)).DxfName), 5); tvs.SetValue(new TypedValue((int)DxfCode.Start, RXClass.GetClass(typeof(Dimension)).DxfName), 6); tvs.SetValue(new TypedValue((int)DxfCode.Operator, "OR>"), 7); tvs.SetValue(new TypedValue((int)DxfCode.LayerName, nameLayer), 8); SelectionSet ss = Select.buildSSet(tvs); ObjectId[] ids = ss.GetObjectIds(); foreach (ObjectId id in ids) { id.delete(); } Alignment objAlign = (Alignment)idAlign.getEnt(); double dblLenAlign = objAlign.Length; switch (fStake.ClassObj) { case "BLDG": Profile profCPNT = Prof.getProfile(idAlign, "CPNT"); objPVIs = profCPNT.PVIs; break; case "CURB": Profile profFLOWLINE = Prof.getProfile(idAlign, "FLOWLINE"); objPVIs = profFLOWLINE.PVIs; break; case "FL": profCPNT = Prof.getProfile(idAlign, "CPNT"); objPVIs = profCPNT.PVIs; break; case "SEWER": case "WTR": profCPNT = Prof.getProfile(idAlign, "CPNT"); objPVIs = profCPNT.PVIs; break; case "ALIGN": Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("Object is an existing design alignment - exiting"); return; } int j = objPVIs.Count; for (int i = 0; i < j; i++) { varPOI_Temp[i].Station = Math.roundDown3(dblLenAlign - (objPVIs[i].Station - objAlign.StartingStation)) + objAlign.StartingStation; //starting station is always 100 varPOI_Temp[i].Elevation = objPVIs[i].Elevation; } objAlign.Reverse(); varpoi = fStake.POI_CALC; //reverse varPOI stationing //need all POIs for descriptions for (int i = 0; i < varpoi.Count; i++) { varpoi[i].Station = Math.roundDown3(dblLenAlign - (varpoi[i].Station - objAlign.StartingStation)) + objAlign.StartingStation; //starting station is always 100 varpoi[i].Side = varpoi[i].Side * -1; switch (varpoi[i].Desc0) { case "AP": if (varpoi[i].isRightHand) { varpoi[i].AngDir = varpoi[i].AngDir + varpoi[i].AngDelta; } else { varpoi[i].AngDir = varpoi[i].AngDir - varpoi[i].AngDelta; } varpoi[i].isRightHand = !varpoi[i].isRightHand; break; case "BC": varpoi[i].Desc0 = "EC"; varpoi[i].DescX = varpoi[i].DescX.Replace("BC", "EC"); break; case "EC": varpoi[i].Desc0 = "BC"; varpoi[i].DescX = varpoi[i].DescX.Replace("EC", "BC"); break; } } varPOI_ORG = fStake.POI_ORG; //reverse varPOI_ORG stationing //need all POIs for descriptions for (int i = 0; i < varPOI_ORG.Count; i++) { varPOI_ORG[i].Station = Math.roundDown3(dblLenAlign - (varPOI_ORG[i].Station - objAlign.StartingStation)) + objAlign.StartingStation; //starting station is always 100 } List <POI> poiTmp = new List <POI>(); var sortPOI = from p in varpoi orderby p.Station ascending select p; foreach (var p in sortPOI) { poiTmp.Add(p); } varpoi = poiTmp; poiTmp = new List <POI>(); var sortPOI_ORG = from n in varPOI_ORG orderby n.Station ascending select n; foreach (var n in sortPOI_ORG) { poiTmp.Add(n); } varPOI_ORG = poiTmp; poiTmp = new List <POI>(); var sortPOI_Temp = from t in varPOI_Temp orderby t.Station ascending select t; foreach (var t in sortPOI_Temp) { poiTmp.Add(t); } varPOI_Temp = poiTmp; j = varpoi.Count; varpoi[0].DescX = varpoi[0].DescX.Replace("END", "BEG"); varpoi[j].DescX = varpoi[j].DescX.Replace("BEG", "END"); ObjectId idTable = Stake_Table.getTableId(idAlign); Stake_Table.addTableData(idTable, varpoi); fStake.POI_CALC = varpoi; fStake.POI_ORG = varPOI_ORG; switch (fStake.ClassObj) { case "BLDG": Stake_AddProfile.makeProfile(idAlign, varPOI_Temp, "STAKE", "ByLayout", true); Stake_UpdateProfile.updateProfile(idAlign, (fStake.POI_ORG), "STAKE", true, "STAKE"); break; case "CURB": Stake_AddProfile.makeProfile(idAlign, varPOI_Temp, "CURB", "ByLayout", true); Stake_UpdateProfile.updateProfile(idAlign, (fStake.POI_ORG), "FLOWLINE", true, "ORG"); break; case "FL": Stake_AddProfile.makeProfile(idAlign, varPOI_Temp, "FLOWLINE", "BySurface", true); Stake_UpdateProfile.updateProfile(idAlign, (fStake.POI_ORG), "STAKE", true, "ORG"); break; case "WTR": Stake_AddProfile.makeProfile(idAlign, varPOI_Temp, "STAKE", "BySurface", true); Stake_UpdateProfile.updateProfile(idAlign, (fStake.POI_ORG), "CPNT", true, "ORG"); Stake_UpdateProfile.updateProfile(idAlign, varpoi, "STAKE", false, "STAKE"); break; } }
syncTableWithProfile() { List <POI> varPOIcur = fStake.POI_CALC; Alignment objAlign = fStake.ACTIVEALIGN; ObjectId idAlign = objAlign.ObjectId; ResultBuffer rb = idAlign.getXData("CLASS"); if (rb == null) { return; } TypedValue[] tvs = rb.AsArray(); fStake.ClassObj = tvs[1].Value.ToString(); Profile objProfile = null; try { objProfile = Prof.getProfile(idAlign, "STAKE"); } catch (System.Exception) { } ProfilePVICollection objProfilePVIs = objProfile.PVIs; Table objTable = null; ObjectId idTable = ObjectId.Null; try { idTable = Stake_Table.getTableId(idAlign); } catch (System.Exception) { try { SelectionSet ss = Select.buildSSet(typeof(Table)); ObjectId[] ids = ss.GetObjectIds(); if (ids.Length > 0) { for (int i = 0; i < ids.Length; i++) { idTable = ids[i]; objTable = (Table)idTable.getEnt(); if (objTable.Cells[1, 1].TextString == objAlign.Name) { break; } } } } catch (System.Exception) { Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("Select Table Failed"); return; } } fStake.POI_CALC = resetPOI(idTable); List <POI> varPOITmp = fStake.POI_CALC; List <POI> varpoi = new List <POI>(); List <POI> varpoiAdd = new List <POI>(); Debug.Print(varPOITmp.Count.ToString()); ProfilePVI objProfilePVI = null; for (int i = 0; i < varPOITmp.Count; i++) { for (int j = 0; j < objProfilePVIs.Count; j++) { objProfilePVI = objProfilePVIs[j]; if (Math.roundDown2((objProfilePVI.Station)) == Math.roundDown2(varPOITmp[i].Station)) { varpoi.Add(varPOITmp[i]); break; } } } bool boolExists = false; for (int i = 0; i < objProfilePVIs.Count; i++) { boolExists = false; objProfilePVI = objProfilePVIs[i]; for (int j = 0; j < varpoi.Count; j++) { if (Math.roundDown2(varpoi[j].Station) == Math.roundDown2((objProfilePVI.Station))) { boolExists = true; break; } } if (!boolExists) { POI vpoi = new POI(); vpoi.Station = Math.roundDown3((objProfilePVI.Station)); vpoi.Elevation = objProfilePVI.Elevation; vpoi.ClassObj = fStake.ClassObj; vpoi.Desc0 = "GB"; varpoiAdd.Add(vpoi); } } if (varpoiAdd[0].Desc0 != "NOTHING") { for (int i = 0; i < varpoiAdd.Count; i++) { varpoi.Add(varpoiAdd[i]); } } var sortSta = from p in varpoi orderby p.Station ascending select p; List <POI> poiTmp = new List <POI>(); foreach (var p in sortSta) { poiTmp.Add(p); } varpoi = poiTmp; updateTableData(idTable, varpoi); fStake.POI_CALC = varpoi; }
private void CreateProfil(double station1, double station2) { using (Transaction tr = db.TransactionManager.StartTransaction()) { // gets the existing profile Autodesk.Civil.DatabaseServices.Profile profile = profiles.SingleOrDefault(x => x.Name == profileName); ProfilePVICollection pPviCollExist = profile.PVIs; ObjectId labelSetId = CivilApplication.ActiveDocument.Styles.LabelSetStyles.ProfileLabelSetStyles["_No Labels"]; ObjectId profileStyleId = CivilApplication.ActiveDocument.Styles.ProfileStyles["Design Profile"]; ObjectId oProfileId = Autodesk.Civil.DatabaseServices.Profile.CreateByLayout("Copied profile", newAlig.ObjectId, newAlig.LayerId, profileStyleId, labelSetId); Autodesk.Civil.DatabaseServices.Profile newProfile = tr.GetObject(oProfileId, OpenMode.ForWrite) as Autodesk.Civil.DatabaseServices.Profile; if (pPviCollExist.Count <= 3) { Point2d point1 = new Point2d(station1, profile.ElevationAt(station1)); Point2d point2 = new Point2d(station2, profile.ElevationAt(station2)); CreateProfileFromEntities(profile.Entities[0], profile, newProfile, point1, point2); tr.Commit(); } else { // finding values near our start station for copied alignment ProfilePVI pPviExistStart = pPviCollExist.GetPVIAt(station1, profile.ElevationAt(station1)); ProfilePVI pPviExistEnd = pPviCollExist.GetPVIAt(station2, profile.ElevationAt(station2)); ProfileEntity pEntitiyAfter = profile.Entities.EntityAtId(pPviExistStart.EntityAfter); Point2d pviEndPoint = new Point2d(pEntitiyAfter.StartStation, pEntitiyAfter.StartElevation); ProfileEntity pEntitiyBefore = profile.Entities.EntityAtId(pPviExistEnd.EntityBefore); Point2d pviStartPoint = new Point2d(pEntitiyBefore.EndStation, pEntitiyBefore.EndElevation); ProfileEntity pStartEntity = pPviExistStart.VerticalCurve; ProfileEntity pEndEntity = pPviExistEnd.VerticalCurve; ProfileEntityCollection pEntities = profile.Entities; uint index = pEntities.FirstEntity; Point2d firstPoint = new Point2d(station1, profile.ElevationAt(station1)); CreateProfileFromEntities(pStartEntity, profile, newProfile, firstPoint, pviEndPoint); int counter = 0; try { while (true) { ProfileEntity pEntity = pEntities.EntityAtId(index); if (pEntity.StartStation >= station1 && pEntity.EndStation <= station2) { Point2d StartPoint = new Point2d(pEntity.StartStation, pEntity.StartElevation); Point2d EndPoint = new Point2d(pEntity.EndStation, pEntity.EndElevation); CreateProfileFromEntities(pEntity, profile, newProfile, StartPoint, EndPoint); counter++; } if (pEntity.StartStation <= station1 && pEntity.EndStation >= station2) { oneEntity = pEntity; } index = pEntity.EntityAfter; } } catch { if (counter == 0) { Point2d point1 = new Point2d(station1, profile.ElevationAt(station1)); Point2d point2 = new Point2d(station2, profile.ElevationAt(station2)); CreateProfileFromEntities(oneEntity, profile, newProfile, point1, point2); } else { Point2d endPoint = new Point2d(station2, profile.ElevationAt(station2)); CreateProfileFromEntities(pEndEntity, profile, newProfile, pviStartPoint, endPoint); } } tr.Commit(); } } }