private void checkTwoPoints() { if (prevSet && currSet && _prevPoint != _currPoint) { currPoint.tag = "Untagged"; prevPoint.tag = "Untagged"; switch (thisPinType) { case pinType.polymaker: lineList.Add(GeoObjConstruction.dLineSegment(currPoint, prevPoint)); //if (_currPoint == pointList[0] && lineList.Count > 1 && pointsAreCoPlanar(pointList,lineList)) if (_currPoint == pointList[0] && lineList.Count > 1) { GeoObjConstruction.iPolygon(lineList, pointList); endInteraction(); } successfullyMade = true; break; case pinType.wireframe: lineList.Add(GeoObjConstruction.dLineSegment(currPoint, prevPoint)); successfullyMade = true; polyCut(); break; case pinType.solidmaker: Debug.Log("This isn't setup yet do not use! Object: " + gameObject.name); Destroy(gameObject, Time.fixedDeltaTime); break; default: break; } } }
/// <summary> /// On Gesture end /// </summary> /// <param name="maybeNullHand">Hand reference that ended the gesture</param> /// <param name="reason">reason the gesture was ended</param> protected override void WhenGestureDeactivated(Hand maybeNullHand, DeactivationReason reason) { this.thisLR.enabled = false; if (maybeNullHand != null) { switch (reason) { case DeactivationReason.FinishedGesture: playSuccessSound(); if (maybeNullHand.Fingers[0].IsExtended) { //thumb up is draw polygon if (prevSet && currSet && _prevPoint != _currPoint) { lineList.Add(GeoObjConstruction.dLineSegment(currPoint, prevPoint)); int idx = pointList.LastIndexOf(_currPoint); int idx2 = pointList.IndexOf(_currPoint); if (idx > idx2 && lineList.Count > 1) { List <AbstractPoint> p1 = pointList.GetRange(idx2, (idx) - idx2); List <AbstractLineSegment> l1 = lineList.Where(l => p1.Contains(l.GetComponent <DependentLineSegment>().point1) || p1.Contains(l.GetComponent <DependentLineSegment>().point2)).ToList(); //TODO: Point list is overpopulated. CodyCodyCodyCodyCodyCody GeoObjConstruction.iPolygon(l1, p1); endInteraction(); } } } else { //thumb down is draw wireframe if (prevSet && currSet && _prevPoint != _currPoint) { lineList.Add(GeoObjConstruction.dLineSegment(currPoint, prevPoint)); } } break; default: break; } Chirality chirality = Chirality.Right; if (maybeNullHand.IsLeft) { chirality = Chirality.Left; } handColourManager.setHandColorMode(chirality, handColourManager.handModes.none); } }
//[ContextMenu("Load from Save")] for debugging make public and uncomment private void xmlToMGO() { Dictionary <string, AbstractGeoObj> spawnedObjects = new Dictionary <string, AbstractGeoObj>(); foreach (GeoObj geo in GeoObjDB.list) { switch (geo.type) { case GeoObjType.point: AbstractGeoObj spawnedPoint = null; //initialzed as null so that cases that do not spawn still have it initialized but still fails a null check. switch (geo.definition) { case GeoObjDef.Abstract: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Dependent: spawnedPoint = GeoObjConstruction.dPoint(geo.position); break; case GeoObjDef.Interactable: spawnedPoint = GeoObjConstruction.iPoint(geo.position); break; case GeoObjDef.Static: spawnedPoint = GeoObjConstruction.sPoint(geo.position); break; case GeoObjDef.none: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; default: break; } if (spawnedPoint != null) { if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(spawnedPoint, geo.label); } spawnedObjects.Add(geo.figName, spawnedPoint); } break; case GeoObjType.line: AbstractGeoObj spawnedLine = null; //initialzed as null so that cases that do not spawn still have it initialized but still fails a null check. switch (geo.definition) { case GeoObjDef.Abstract: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Dependent: spawnedLine = GeoObjConstruction.dLineSegment(spawnedObjects[geo.dependencies[0]] as AbstractPoint, spawnedObjects[geo.dependencies[1]] as AbstractPoint); break; case GeoObjDef.Interactable: spawnedLine = GeoObjConstruction.iLineSegment(spawnedObjects[geo.dependencies[0]] as AbstractPoint, spawnedObjects[geo.dependencies[1]] as AbstractPoint); break; case GeoObjDef.Static: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.none: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; default: break; } if (spawnedLine != null) { if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(spawnedLine, geo.label); } spawnedObjects.Add(geo.figName, spawnedLine); } break; case GeoObjType.polygon: AbstractGeoObj spawnedPoly = null; //initialzed as null so that cases that do not spawn still have it initialized but still fails a null check. List <AbstractLineSegment> lineList; List <AbstractPoint> pointList; switch (geo.definition) { case GeoObjDef.Abstract: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Dependent: lineList = new List <AbstractLineSegment>(); geo.dependencies.Where(d => spawnedObjects[d].figType == GeoObjType.line).ToList().ForEach(l => lineList.Add(spawnedObjects[l] as AbstractLineSegment)); pointList = new List <AbstractPoint>(); geo.dependencies.Where(d => spawnedObjects[d].figType == GeoObjType.point).ToList().ForEach(p => pointList.Add(spawnedObjects[p] as AbstractPoint)); spawnedPoly = GeoObjConstruction.dPolygon(lineList, pointList); break; case GeoObjDef.Interactable: lineList = new List <AbstractLineSegment>(); geo.dependencies.Where(d => spawnedObjects[d].figType == GeoObjType.line).ToList().ForEach(l => lineList.Add(spawnedObjects[l] as AbstractLineSegment)); pointList = new List <AbstractPoint>(); geo.dependencies.Where(d => spawnedObjects[d].figType == GeoObjType.point).ToList().ForEach(p => pointList.Add(spawnedObjects[p] as AbstractPoint)); spawnedPoly = GeoObjConstruction.iPolygon(lineList, pointList); break; case GeoObjDef.Static: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.none: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; default: break; } if (spawnedPoly != null) { if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(spawnedPoly, geo.label); } spawnedObjects.Add(geo.figName, spawnedPoly); } break; case GeoObjType.prism: AbstractGeoObj spawnedPrism = null; //initialzed as null so that cases that do not spawn still have it initialized but still fails a null check. switch (geo.definition) { case GeoObjDef.Abstract: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Dependent: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Interactable: if (!(geo.prismData.bases.Count < 2 || geo.prismData.sides.Count < spawnedObjects[geo.prismData.bases[0]].GetComponent <AbstractPolygon>().pointList.Count)) { List <AbstractPolygon> bases = new List <AbstractPolygon>(); List <AbstractPolygon> sides = new List <AbstractPolygon>(); geo.prismData.bases.ForEach(b => bases.Add(spawnedObjects[b] as AbstractPolygon)); geo.prismData.sides.ForEach(s => sides.Add(spawnedObjects[s] as AbstractPolygon)); spawnedPrism = GeoObjConstruction.iPrism(bases, sides); } else { List <AbstractLineSegment> edges = new List <AbstractLineSegment>(); geo.prismData.edges.ForEach(e => edges.Add(spawnedObjects[e] as AbstractLineSegment)); spawnedPrism = GeoObjConstruction.iPrism(edges); } break; case GeoObjDef.Static: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.none: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; default: break; } if (spawnedPrism != null) { if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(spawnedPrism, geo.label); } spawnedObjects.Add(geo.figName, spawnedPrism); } break; case GeoObjType.pyramid: AbstractGeoObj spawnedPyramid = null; //initialzed as null so that cases that do not spawn still have it initialized but still fails a null check. switch (geo.definition) { case GeoObjDef.Abstract: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Dependent: spawnedPyramid = GeoObjConstruction.dPyramid(spawnedObjects[geo.dependencies[0]] as AbstractPolygon, spawnedObjects[geo.pyramidData.apexName] as AbstractPoint); break; case GeoObjDef.Interactable: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Static: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.none: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; default: break; } if (spawnedPyramid != null) { if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(spawnedPyramid, geo.label); } spawnedObjects.Add(geo.figName, spawnedPyramid); } break; case GeoObjType.circle: AbstractGeoObj spawnedCircle = null; //initialzed as null so that cases that do not spawn still have it initialized but still fails a null check. switch (geo.definition) { case GeoObjDef.Abstract: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Dependent: spawnedCircle = GeoObjConstruction.dCircle(spawnedObjects[geo.dependencies[0]] as AbstractPoint, spawnedObjects[geo.dependencies[1]] as AbstractPoint, geo.circleData.normDir); break; case GeoObjDef.Interactable: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Static: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.none: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; default: break; } if (spawnedCircle != null) { if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(spawnedCircle, geo.label); } spawnedObjects.Add(geo.figName, spawnedCircle); } break; case GeoObjType.sphere: AbstractGeoObj spawnedSphere = null; //initialzed as null so that cases that do not spawn still have it initialized but still fails a null check. switch (geo.definition) { case GeoObjDef.Abstract: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Dependent: spawnedSphere = GeoObjConstruction.dSphere(spawnedObjects[geo.dependencies[0]] as AbstractPoint, spawnedObjects[geo.dependencies[1]] as AbstractPoint); break; case GeoObjDef.Interactable: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Static: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.none: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; default: break; } if (spawnedSphere != null) { if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(spawnedSphere, geo.label); } spawnedObjects.Add(geo.figName, spawnedSphere); } break; case GeoObjType.revolvedsurface: AbstractGeoObj spawnedrevSurf = null; //initialzed as null so that cases that do not spawn still have it initialized but still fails a null check. switch (geo.definition) { case GeoObjDef.Abstract: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Dependent: spawnedrevSurf = GeoObjConstruction.dRevSurface(spawnedObjects[geo.dependencies[0]] as AbstractPoint, spawnedObjects[geo.dependencies[1]] as AbstractLineSegment, geo.revSurfData.normDir); spawnedrevSurf.transform.position = geo.position; spawnedrevSurf.transform.rotation = geo.rotation; break; case GeoObjDef.Interactable: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Static: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.none: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; default: break; } if (spawnedrevSurf != null) { if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(spawnedrevSurf, geo.label); } spawnedObjects.Add(geo.figName, spawnedrevSurf); } break; case GeoObjType.torus: break; case GeoObjType.flatface: Transform flatface = flatfaceBehave.Constructor().transform; flatface.transform.position = geo.position; flatface.transform.rotation = geo.rotation; if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(flatface.GetComponent <flatfaceBehave>(), geo.label); } spawnedObjects.Add(geo.figName, flatface.GetComponent <AbstractGeoObj>()); break; case GeoObjType.straightedge: Transform straightEdge = straightEdgeBehave.Constructor().transform; straightEdge.transform.position = geo.position; straightEdge.transform.rotation = geo.rotation; if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(straightEdge.GetComponent <straightEdgeBehave>(), geo.label); } spawnedObjects.Add(geo.figName, straightEdge.GetComponent <AbstractGeoObj>()); break; default: break; } } }
private void polyCut() { List <AbstractPolygon> prevPointPolygons = new List <AbstractPolygon>(); List <AbstractPolygon> currPointPolygons = new List <AbstractPolygon>(); HW_GeoSolver.ins.geomanager.bidirectionalNeighborsOfNode(_prevPoint.figName) //all bidirectional neighbors .Where(d => HW_GeoSolver.ins.geomanager.findGraphNode(d.Value).mytransform.GetComponent <AbstractPolygon>() != null).ToList() // list of all abstractpolygons in prev list .ForEach(d => prevPointPolygons.Add(HW_GeoSolver.ins.geomanager.findGraphNode(d.Value).mytransform.GetComponent <AbstractPolygon>())); //foreach adds the polygon to final list HW_GeoSolver.ins.geomanager.bidirectionalNeighborsOfNode(_currPoint.figName) //same as above but with other point .Where(d => HW_GeoSolver.ins.geomanager.findGraphNode(d.Value).mytransform.GetComponent <AbstractPolygon>() != null).ToList() .ForEach(d => currPointPolygons.Add(HW_GeoSolver.ins.geomanager.findGraphNode(d.Value).mytransform.GetComponent <AbstractPolygon>())); //prevPointPolygons.ForEach(p => Debug.Log(_prevPoint.figName + " is in the following: " + p.figName)); //Debug.Log("_____+_____"); //currPointPolygons.ForEach(p => Debug.Log(_currPoint.figName + " is in the following: " + p.figName)); //Debug.Log("_____=_____"); List <AbstractPolygon> sharedPolygons; if (prevPointPolygons.Count > currPointPolygons.Count) { sharedPolygons = prevPointPolygons.Intersect(currPointPolygons).Where(poly => poly.lineList.Count > 3).ToList(); } else { sharedPolygons = currPointPolygons.Intersect(prevPointPolygons).Where(poly => poly.lineList.Count > 3).ToList(); } //sharedPolygons.ForEach(p => Debug.Log("Both are in the following: " + p.figName)); //list created from any duplicates from two prev lists that have more than 3 sides //Debug.Log(_prevPoint.figName + " and " + _currPoint.figName + " are both on " + sharedPolygons.Count + " together."); if (sharedPolygons.Count > 0) { DependentLineSegment cutLine = GeoObjConstruction.dLineSegment(_prevPoint, _currPoint); foreach (AbstractPolygon p in sharedPolygons) { List <AbstractPoint> currPointList = p.pointList; List <AbstractLineSegment> currLineList = p.lineList; if (Mathf.Abs(currPointList.IndexOf(_prevPoint) - currPointList.IndexOf(_currPoint)) > 1) { List <AbstractPoint> newPointList1 = newPointListGen(currPointList, currPointList.IndexOf(_prevPoint), currPointList.IndexOf(_currPoint)); List <AbstractPoint> newPointList2 = newPointListGen(currPointList, currPointList.IndexOf(_currPoint), currPointList.IndexOf(_prevPoint)); List <AbstractLineSegment> newLineList1 = new List <AbstractLineSegment>() { cutLine }; //creates list and adds the line created by the cut List <AbstractLineSegment> newLineList2 = new List <AbstractLineSegment>() { cutLine }; //creates list and adds the line created by the cut foreach (AbstractLineSegment currLine in currLineList //newLineList1 Generator .Where(cL => ((cL.GetComponent <InteractableLineSegment>() != null && //is interactable line segment and point1 or point2 is found in newPointList1 newPointList1.Any(point => point == cL.GetComponent <InteractableLineSegment>().point1 || point == cL.GetComponent <InteractableLineSegment>().point2)) || ((cL.GetComponent <DependentLineSegment>() != null && //is dependent line segment and point1 or point2 is found in newPointList1 newPointList1.Any(point => point == cL.GetComponent <DependentLineSegment>().point1 || point == cL.GetComponent <DependentLineSegment>().point2)))))) { newLineList1.Add(currLine); } foreach (AbstractLineSegment currLine in currLineList //newLineList2 Generator .Where(cL => ((cL.GetComponent <InteractableLineSegment>() != null && //is interactable line segment and point1 or point2 is found in newPointList1 newPointList2.Any(point => point == cL.GetComponent <InteractableLineSegment>().point1 || point == cL.GetComponent <InteractableLineSegment>().point2)) || ((cL.GetComponent <DependentLineSegment>() != null && //is dependent line segment and point1 or point2 is found in newPointList1 newPointList2.Any(point => point == cL.GetComponent <DependentLineSegment>().point1 || point == cL.GetComponent <DependentLineSegment>().point2)))))) { newLineList2.Add(currLine); } AbstractPolygon newPoly1 = GeoObjConstruction.iPolygon(newLineList1, newPointList1); AbstractPolygon newPoly2 = GeoObjConstruction.iPolygon(newLineList2, newPointList2); List <InteractablePrism> currPrismList = new List <InteractablePrism>(); HW_GeoSolver.ins.geomanager.bidirectionalNeighborsOfNode(p.figName) //all bidirectional neighbors .Where(d => HW_GeoSolver.ins.geomanager.findGraphNode(d.Value).mytransform.GetComponent <InteractablePrism>() != null).ToList().ForEach(prism => currPrismList.Add(prism.mytransform.GetComponent <InteractablePrism>())); foreach (InteractablePrism cPrism in currPrismList) { HW_GeoSolver.ins.AddDependence(newPoly1, cPrism); HW_GeoSolver.ins.AddDependence(newPoly2, cPrism); } HW_GeoSolver.ins.removeComponent(p); } } } }