/// <summary> /// Converts world position to be snapped to closest grid. /// </summary> /// <param name="worldPos">World position.</param> /// <param name="gridSize">Grid size.</param> /// <param name="staticGridAlignToCenter">Is grid align to static.</param> /// <returns></returns> public CoordSystemData SnapWorldPosToClosestGrid(ref Vector3D worldPos, double gridSize, bool staticGridAlignToCenter) { m_lastSelectedCoordSys = m_selectedCoordSys; MyLocalCoordSys localCoordSys = null; localCoordSys = this.GetClosestCoordSys(ref worldPos); // If no coord sys found, return origin(0,0,0) with no rotation! if (localCoordSys == null) { localCoordSys = new MyLocalCoordSys(m_coorsSystemSize); m_selectedCoordSys = 0; } else m_selectedCoordSys = localCoordSys.Id; if (m_selectedCoordSys == 0) { m_localCoordExist = false; } else { m_localCoordExist = true; } if (m_selectedCoordSys != m_lastSelectedCoordSys) { m_selectionChanged = true; if(OnCoordinateChange != null) OnCoordinateChange(); } else m_selectionChanged = false; //if (!m_localCoordExist && m_selectionChanged) //{ // this.Disable(); //} //else if (m_selectionChanged && m_lastSelectedCoordSys == 0) //{ // this.Enable(); //} CoordSystemData coordData = new CoordSystemData(); Quaternion rotation = localCoordSys.Origin.Rotation; Quaternion invRotation = Quaternion.Inverse(rotation); Vector3D position = localCoordSys.Origin.Position; Vector3D vec = worldPos - position; vec = Vector3D.Transform(vec, invRotation); MyCoordinateSystem.GetPosRoundedToGrid(ref vec, gridSize, staticGridAlignToCenter); coordData.LocalSnappedPos = vec; vec = Vector3D.Transform(vec, rotation); MyTransformD localCoordsTransform = new MyTransformD(); localCoordsTransform.Position = position + vec; localCoordsTransform.Rotation = rotation; coordData.SnappedTransform = localCoordsTransform; coordData.Origin = localCoordSys.Origin; return coordData; }
/// <summary> /// Converts world position to be snapped to closest grid. /// </summary> /// <param name="worldPos">World position.</param> /// <param name="gridSize">Grid size.</param> /// <param name="staticGridAlignToCenter">Is grid align to static.</param> /// <returns></returns> public CoordSystemData SnapWorldPosToClosestGrid(ref Vector3D worldPos, double gridSize, bool staticGridAlignToCenter) { m_lastSelectedCoordSys = m_selectedCoordSys; MyLocalCoordSys localCoordSys = null; localCoordSys = this.GetClosestCoordSys(ref worldPos); // If no coord sys found, return origin(0,0,0) with no rotation! if (localCoordSys == null) { localCoordSys = new MyLocalCoordSys(m_coorsSystemSize); m_selectedCoordSys = 0; } else { m_selectedCoordSys = localCoordSys.Id; } if (m_selectedCoordSys == 0) { m_localCoordExist = false; } else { m_localCoordExist = true; } if (m_selectedCoordSys != m_lastSelectedCoordSys) { m_selectionChanged = true; if (OnCoordinateChange != null) { OnCoordinateChange(); } } else { m_selectionChanged = false; } //if (!m_localCoordExist && m_selectionChanged) //{ // this.Disable(); //} //else if (m_selectionChanged && m_lastSelectedCoordSys == 0) //{ // this.Enable(); //} CoordSystemData coordData = new CoordSystemData(); Quaternion rotation = localCoordSys.Origin.Rotation; Quaternion invRotation = Quaternion.Inverse(rotation); Vector3D position = localCoordSys.Origin.Position; Vector3D vec = worldPos - position; vec = Vector3D.Transform(vec, invRotation); MyCoordinateSystem.GetPosRoundedToGrid(ref vec, gridSize, staticGridAlignToCenter); coordData.LocalSnappedPos = vec; vec = Vector3D.Transform(vec, rotation); MyTransformD localCoordsTransform = new MyTransformD(); localCoordsTransform.Position = position + vec; localCoordsTransform.Rotation = rotation; coordData.SnappedTransform = localCoordsTransform; coordData.Origin = localCoordSys.Origin; return(coordData); }