return (planeNormal.dot(point) + d);
}
+ public static Vector3d projectToPlane(Vector3d v, Vector3d planeNormal) {
+ //v.normalize();
+ //planeNormal.normalize();
+ Vector3d t = new Vector3d();
+ t.cross(v,planeNormal);
+ t.cross(planeNormal, t);
+ return t;
+
+ }
+
public static boolean intersectStraightPlane(Tuple3d linePoint, Vector3d lineDir, Tuple3d planePoint, Vector3d planeNormal, Tuple3d intersectPoint) {
intersectPoint.set(planePoint);
intersectPoint.sub(linePoint);
public static boolean createRotation(Vector3d original, Vector3d rotated, AxisAngle4d result) {
- if (rotated.lengthSquared() > 0.01)
- rotated.normalize();
- else
- return false;
- double d = original.dot(rotated);
- if (d > 0.9999) {
- // original and rotated are parallel, pointing at the same direction
- result.angle = 0.0;
- result.x = 0.0;
- result.y = 1.0;
- result.z = 0.0;
- } else if (d < -0.9999) {
- // original and rotated are parallel, pointing at the opposite direction
- Vector3d a = Z_AXIS;
- if (Math.abs(a.dot(original)) > 0.8 )
- a = Y_AXIS;
- result.set(a, Math.PI);
- } else {
- double angle = original.angle(rotated);
- Vector3d axis = new Vector3d();
- axis.cross(original, rotated);
- result.set(axis,angle);
- }
- return true;
+ if (rotated.lengthSquared() > 0.01)
+ rotated.normalize();
+ else
+ return false;
+ double d = original.dot(rotated);
+ if (d > 0.9999) {
+ // original and rotated are parallel, pointing at the same direction
+ result.angle = 0.0;
+ result.x = 0.0;
+ result.y = 1.0;
+ result.z = 0.0;
+ } else if (d < -0.9999) {
+ // original and rotated are parallel, pointing at the opposite direction
+ Vector3d a = Z_AXIS;
+ if (Math.abs(a.dot(original)) > 0.8 )
+ a = Y_AXIS;
+ result.set(a, Math.PI);
+ } else {
+ double angle = original.angle(rotated);
+ Vector3d axis = new Vector3d();
+ axis.cross(original, rotated);
+ result.set(axis,angle);
}
+ return true;
+ }
public static boolean createRotation(Vector3d original, Vector3d rotated, Quat4d result) {
- if (rotated.lengthSquared() > 0.01)
- rotated.normalize();
- else
- return false;
- double d = original.dot(rotated);
- if (d > 0.9999) {
- // original and rotated are parallel, pointing at the same direction
- result.w = 1.0;
- result.x = 0.0;
- result.y = 0.0;
- result.z = 0.0;
- } else if (d < -0.9999) {
- // original and rotated are parallel, pointing at the opposite direction
- Vector3d a = Z_AXIS;
- if (Math.abs(a.dot(original)) > 0.8 )
- a = Y_AXIS;
- getQuat(a, Math.PI, result);
-
- } else {
- double angle = original.angle(rotated);
- Vector3d axis = new Vector3d();
- axis.cross(original, rotated);
- getQuat(axis, angle, result);
- }
- return true;
+ if (rotated.lengthSquared() > 0.01)
+ rotated.normalize();
+ else
+ return false;
+ double d = original.dot(rotated);
+ if (d > 0.9999) {
+ // original and rotated are parallel, pointing at the same direction
+ result.w = 1.0;
+ result.x = 0.0;
+ result.y = 0.0;
+ result.z = 0.0;
+ } else if (d < -0.9999) {
+ // original and rotated are parallel, pointing at the opposite direction
+ Vector3d a = Z_AXIS;
+ if (Math.abs(a.dot(original)) > 0.8 )
+ a = Y_AXIS;
+ getQuat(a, Math.PI, result);
+
+ } else {
+ double angle = original.angle(rotated);
+ Vector3d axis = new Vector3d();
+ axis.cross(original, rotated);
+ getQuat(axis, angle, result);
}
+ return true;
+ }
+
+ public static boolean createRotation(Vector3d original, Vector3d rotated, Vector3d axis, AxisAngle4d result) {
+
+ if (rotated.lengthSquared() > 0.01)
+ rotated.normalize();
+ else
+ return false;
+ if (original.lengthSquared() > 0.01)
+ original.normalize();
+ else
+ return false;
+ if (axis.lengthSquared() > 0.01)
+ axis.normalize();
+ else
+ return false;
+ double d = original.dot(rotated);
+ if (d > 0.9999) {
+ // original and rotated are parallel, pointing at the same direction
+ result.angle = 0.0;
+ result.x = axis.x;
+ result.y = axis.y;
+ result.z = axis.z;
+ } else if (d < -0.9999) {
+ // original and rotated are parallel, pointing at the opposite direction
+ result.angle = Math.PI;
+ result.x = axis.x;
+ result.y = axis.y;
+ result.z = axis.z;
+ } else {
+ Vector3d p1 = projectToPlane(original, axis);
+ Vector3d p2 = projectToPlane(rotated, axis);
+ double angle = p1.angle(p2);
+ result.set(axis,angle);
+
+ }
+ return true;
+ }
public static void getQuat(Vector3d axis, double angle, Quat4d q)
{
@RelatedSetObj(Plant3D.URIs.HasNext)
public void setNext(PipelineComponent comp) {
if (next == comp)
- return;
+ return;
if (this.next != null)
- this.next._removeRef(this);
- this.next = comp;
- this.syncnext = false;
- if (DEBUG) System.out.println(this + " next " + comp);
- syncNext();
- firePropertyChanged(Plant3D.URIs.HasNext);
- if (comp != null)
- comp.sync();
-
+ this.next._removeRef(this);
+ _setNext(comp);
+ this.syncnext = false;
+ if (DEBUG) System.out.println(this + " next " + comp);
+ syncNext();
+ firePropertyChanged(Plant3D.URIs.HasNext);
+ if (comp != null)
+ comp.sync();
+ }
+
+ protected void _setNext(PipelineComponent comp) {
+ this.next = comp;
}
return;
if (this.previous != null)
this.previous._removeRef(this);
- this.previous = comp;
+ _setPrevious(comp);
this.syncprev = false;
if (DEBUG) System.out.println(this + " prev " + comp);
syncPrevious();
firePropertyChanged(Plant3D.URIs.HasPrevious);
if (comp != null)
comp.sync();
-
}
+
+ protected void _setPrevious(PipelineComponent comp) {
+ this.previous = comp;
+ }
+
private PipelineComponent branch0;
@RelatedGetObj(Plant3D.URIs.HasBranch0)
// Control point structure is left into illegal state.
private void _removeRef(PipelineComponent comp) {
if (next == comp) {
- next = null;
+ _setNext(null);
syncnext = false;
if (DEBUG) System.out.println(this + " remove next " + comp);
firePropertyChanged(Plant3D.URIs.HasNext);
syncNext();
} else if (previous == comp) {
- previous = null;
+ _setPrevious(null);
syncprev = false;
if (DEBUG) System.out.println(this + " remove prev " + comp);
firePropertyChanged(Plant3D.URIs.HasPrevious);
if (this.next == next)
return;
if (DEBUG) System.out.println(this + " next " + next);
+ if (next == null && isVariableAngle() && previous != null && !isRemoved()) {
+ convertVariableAngleToFixed(Direction.NEXT);
+ }
this.next = next;
if (component != null) {
if (parent == null || isSub)
component.setBranch0(next != null ? next.component : null);
updateSubPoint();
}
-
}
public void setPrevious(PipeControlPoint previous) {
if (this.previous == previous)
return;
if (DEBUG) System.out.println(this + " previous " + previous);
+ if (previous == null && isVariableAngle() && next != null && !isRemoved()) {
+ convertVariableAngleToFixed(Direction.PREVIOUS);
+ }
this.previous = previous;
if (component != null) {
if (parent == null || isSub)
component.setBranch0(previous != null ? previous.component : null);
updateSubPoint();
}
-
+ }
+
+ private void convertVariableAngleToFixed(Direction direction) {
+ // We are removing reference, which transforms variable angle to fixed angle.
+ // Since fixed angle is defined differently, we need to calculate fixed angle parameters based on current data
+ // We need to calculate turnAngle and rotationAngle
+ Vector3d dirOut = getPathLegDirection(direction == Direction.NEXT ? Direction.NEXT : Direction.PREVIOUS);
+ Vector3d dir = getPathLegDirection(direction == Direction.NEXT ? Direction.PREVIOUS : Direction.NEXT);
+ dir.negate();
+ dirOut.normalize();
+ dir.normalize();
+ double angle = dir.angle(dirOut);
+ //super._setNext(null);
+ if (direction == Direction.NEXT)
+ next = null;
+ else
+ previous = null;
+ setRotationAngle(0.0);
+ setReversed(direction == Direction.NEXT ? false : true);
+ Vector3d dirOutN = getPathLegDirection(direction == Direction.NEXT ? Direction.NEXT : Direction.PREVIOUS);
+ dirOutN.normalize();
+ AxisAngle4d aa = new AxisAngle4d();
+ if (MathTools.createRotation(dirOutN, dirOut, dir, aa)) {
+ setRotationAngle(aa.angle);
+ setTurnAngle(angle);
+ }
}
public PipeControlPoint parent;
@GetPropertyValue(name="Rotation Angle",tabId="Debug",value="rotationAngle")
public Double getRotationAngle() {
- return rotationAngle;
+ if (asFixedAngle())
+ return rotationAngle;
+ return null;
}
@GetPropertyValue(name="Reversed",tabId="Debug",value="reversed")
PipeControlPoint additionalRemove = null;
if (!PipingRules.isEnabled()) {
+ component = null;
setPrevious(null);
setNext(null);
} else {
private void removeParentPoint() {
throw new RuntimeException("Child points cannot be removed directly");
}
+
+ public boolean isRemoved() {
+ return component == null;
+ }
private void removeComponent() {
if (component == null)