+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<projectDescription>\r
- <name>3d_ontologies</name>\r
- <comment></comment>\r
- <projects>\r
- </projects>\r
- <buildSpec>\r
- </buildSpec>\r
- <natures>\r
- </natures>\r
-</projectDescription>\r
+++ /dev/null
-%import "foundation.graph"\r
-\r
-%import "csg.graph"\r
-%import "equation.graph"\r
+++ /dev/null
-%import "layer0.graph"\r
-%import "layer0.graph" L0\r
-%import "animation.graph"\r
-%import "g3d.graph"\r
-%define symmetric()\r
- $subject\r
- $layer0.InverseOf $subject\r
-%define tag($tagname)\r
- $subject\r
- $tagname $subject\r
-%deflib Type _ @ "Types" : TypeLibrary\r
- PartOf CSGOntology\r
-%deflib Relation _ @ "Relations" : RelationLibrary\r
- PartOf CSGOntology\r
-%deflib Library CSGOntology\r
-CSGOntology @ "CSG Ontology" : Ontology\r
- PartOf TypeSystemProject\r
- HasNamespace "http://www.vtt.fi/Simantics/CSG/1.0" : URI\r
- HasVersion "1.0" : Version\r
- HasResourceClass "org.simantics.proconf.g3d.csg.stubs.CSGResource" : String\r
- HasStubsPackage "org.simantics.proconf.g3d.csg.stubs" : String\r
-\r
-CSGNamespace : Namespace\r
- PartOf TypeSystemNamespaces\r
- HasNamespace "http://www.vtt.fi/Simantics/CSG/1.0" : URI\r
- HasNamespaceRoot CSGOntology\r
-\r
-# Project\r
-CSGProjectType <T ProjectType\r
-CSGProject : CSGProjectType <T Project\r
- PartOf ProjectTypes\r
- \r
-CSGShape <T Shape\r
-CSGModel <T G3DModel\r
-Primitive <T CSGShape\r
- [HasSizingProperty card "0..*"]\r
-HasMainShape <R HasGeometryDefinition\r
- HasDomain [BooleanOperation]\r
- HasRange [CSGShape]\r
-HasSecondaryShape <R HasGeometryDefinition\r
- HasDomain [BooleanOperation]\r
- HasRange [CSGShape]\r
-BooleanOperation <T CSGShape\r
- [HasMainShape card "0..1"]\r
- [HasSecondaryShape card "0..*"]\r
-Difference <T BooleanOperation\r
-Intersection <T BooleanOperation\r
-Union <T BooleanOperation\r
-HasSizingProperty <R HasNonTransformation\r
-HasXAxisSize @ "Has X Axis Size" <R HasSizingProperty\r
- HasRange [Double]\r
-HasYAxisSize @ "Has Y Axis Size" <R HasSizingProperty\r
- HasRange [Double]\r
-HasZAxisSize @ "Has Z Axis Size" <R HasSizingProperty\r
- HasRange [Double]\r
-HasXAxisMinimumSize @ "Has X Axis Minimum Size" <R HasSizingProperty\r
- HasRange [Double]\r
-HasZAxisMinimumSize @ "Has Z Axis Minimum Size" <R HasSizingProperty\r
- HasRange [Double]\r
-HasXAxisMaximumSize @ "Has X Axis Maximum Size" <R HasSizingProperty\r
- HasRange [Double]\r
-HasZAxisMaximumSize @ "Has Z Axis Maximum Size" <R HasSizingProperty\r
- HasRange [Double]\r
-HasRadius <R HasSizingProperty\r
- HasRange [Double]\r
-HasMajorRadius <R HasSizingProperty\r
- HasRange [Double]\r
-HasMinorRadius <R HasSizingProperty\r
- HasRange [Double]\r
-HasTopRadius <R HasSizingProperty\r
- HasRange [Double]\r
-HasBottomRadius <R HasSizingProperty\r
- HasRange [Double]\r
-HasHeight <R HasSizingProperty\r
- HasRange [Double]\r
-HasCorners <R HasSizingProperty\r
- HasRange [Integer]\r
-Box <T Primitive\r
- [HasXAxisSize card "1"]\r
- [HasYAxisSize card "1"]\r
- [HasZAxisSize card "1"]\r
-Sphere <T Primitive\r
- [HasRadius card "1"]\r
-Cone <T Primitive\r
- [HasTopRadius card "1"]\r
- [HasBottomRadius card "1"]\r
- [HasHeight card "1"]\r
-Cylinder <T Primitive\r
- [HasRadius card "1"]\r
- [HasHeight card "1"]\r
-Barrel <T Primitive\r
- [HasMinorRadius card "1"]\r
- [HasMajorRadius card "1"]\r
- [HasHeight card "1"]\r
-EllipticCylinder <T Primitive\r
- [HasMinorRadius card "1"]\r
- [HasMajorRadius card "1"]\r
- [HasHeight card "1"]\r
-RegularPrism <T Primitive\r
- [HasHeight card "1"]\r
- [HasRadius card "1"]\r
- [HasCorners card "1"]\r
-Torus <T Primitive\r
- [HasMinorRadius card "1"]\r
- [HasMajorRadius card "1"]\r
-RectangularSolid <T Primitive\r
- [HasXAxisMinimumSize card "1"]\r
- [HasXAxisMaximumSize card "1"]\r
- [HasYAxisSize card "1"]\r
- [HasZAxisMinimumSize card "1"]\r
- [HasZAxisMaximumSize card "1"]\r
-\r
-csgViewpointLibrary @ "Viewpoint Library" : ViewpointLibrary\r
- PartOf CSGOntology\r
-csgState @ _ : ViewpointState\r
-csgTraversalRule @ _ : RelationBasedTraversalRule\r
- HasContext csgState\r
- L0.HasTargetState csgState\r
- AcceptsRelation HasChild\r
-csgAcceptRule @ _ : AcceptAllResourceAcceptRule\r
-CSGStructureViewpoint @ "CSG Structure Viewpoint" : ResourceViewpoint\r
- HasInitialState csgState\r
- HasTraversalRule csgTraversalRule\r
- HasResourceAcceptRule csgAcceptRule\r
- PartOf csgViewpointLibrary\r
+++ /dev/null
-..\foundation_ontologies\r
-..\2d_ontologies\r
+++ /dev/null
-%import "layer0.graph" \r
-%import "animation.graph"\r
-%import "image.graph" IMAGE\r
-%define symmetric()\r
- $subject\r
- $layer0.InverseOf $subject\r
-%define tag($tagname)\r
- $subject\r
- $tagname $subject\r
-%deflib Type _ @ "Types" : TypeLibrary\r
- PartOf G3DOntology\r
-%deflib Relation _ @ "Relations" : RelationLibrary\r
- PartOf G3DOntology\r
-%deflib Library G3DOntology\r
-G3DOntology @ "G3D Ontology" : Ontology\r
- PartOf TypeSystemProject\r
- HasNamespace "http://www.vtt.fi/Simantics/G3D/1.0" : URI\r
- HasVersion "1.0" : Version\r
- HasResourceClass "org.simantics.proconf.g3d.stubs.G3DResource" : String\r
- HasStubsPackage "org.simantics.proconf.g3d.stubs" : String\r
-\r
-G3DNamespace @ "G3D Namespace" : Namespace\r
- PartOf TypeSystemNamespaces\r
- HasNamespace "http://www.vtt.fi/Simantics/G3D/1.0" : URI\r
- HasNamespaceRoot G3DOntology\r
-\r
-HasTransformationValue <R HasProperty\r
- InverseOf TransformationValueOf\r
- HasRange [Double]\r
-HasX <R HasTransformationValue\r
-HasY <R HasTransformationValue\r
-HasZ <R HasTransformationValue\r
-HasAngle <R HasTransformationValue\r
-Tuple3 <T Property\r
- [HasX card "1"]\r
- [HasY card "1"]\r
- [HasZ card "1"]\r
-Position <T Tuple3\r
-Center <T Tuple3\r
-Orientation <T Property\r
- [HasX card "1"]\r
- [HasY card "1"]\r
- [HasZ card "1"]\r
- [HasAngle card "1"]\r
-Transformation <T Property\r
-Position <T Transformation\r
-Orientation <T Transformation\r
-Center <T Transformation\r
-\r
-# Parent-child relationship\r
-HasChild <R IsRelatedTo\r
- InverseOf HasParent\r
- HasDomain [G3DNode]\r
- HasRange [G3DNode]\r
-HasGeometryDefinition <R HasChild\r
- InverseOf GeometryDefinitionOf\r
-\r
-# Properties of G3DNode are divided into transformation properties and non-transformation properties \r
-# All 3D properties must be inherited from these two. (Queries that update scene-graph require this) \r
-HasTransformation <R HasProperty\r
- InverseOf TransformationOf\r
-HasNonTransformation <R HasProperty\r
- InverseOf NonTransformationOf\r
- \r
-HasLocalPosition <R HasTransformation\r
- HasRange [Position]\r
- InverseOf LocalPositionOf\r
-HasWorldPosition <R HasTransformation\r
- HasRange [Position]\r
- InverseOf WorldPositionOf\r
-HasLocalOrientation <R HasTransformation\r
- HasRange [Orientation]\r
- InverseOf LocalOrientationOf\r
-HasWorldOrientation <R HasTransformation\r
- HasRange [Orientation]\r
- InverseOf WorldOrientationOf\r
-HasCenter <R HasTransformation\r
- HasRange [Center]\r
-G3DNode @ "G3DNode" <T Entity\r
- [HasParent card "0..1"]\r
- [HasChild card "0..*"]\r
- [HasLocalPosition card "0..1"]\r
- [HasWorldPosition card "0..1"]\r
- [HasLocalOrientation card "0..1"]\r
- [HasWorldOrientation card "0..1"]\r
- [HasCenter card "0..1"]\r
- HasDescription "Base node for scene-graph" : String\r
- Includes\r
- HasChild\r
- Propagates\r
- HasChild\r
-HasG3DNode @ "Has G3DNode" <R DependsOn\r
- HasRange [G3DNode]\r
-HasRed <R HasProperty\r
- HasRange [Double]\r
-HasGreen <R HasProperty\r
- HasRange [Double]\r
-HasBlue <R HasProperty\r
- HasRange [Double]\r
-HasTransparency <R HasProperty\r
- HasRange [Double]\r
-HasShininess <R HasProperty\r
- HasRange [Double]\r
-Color <T Entity\r
- [HasRed card "1"]\r
- [HasGreen card "1"]\r
- [HasBlue card "1"]\r
-HasDiffuseColor <R IsRelatedTo\r
- InverseOf DiffuseColorOf\r
- HasRange [Color]\r
-HasSpecularColor <R IsRelatedTo\r
- InverseOf SpecularColorOf\r
- HasRange [Color]\r
-HasAmbientColor <R IsRelatedTo\r
- InverseOf AmbientColorOf\r
- HasRange [Color]\r
-HasEmissiveColor <R IsRelatedTo\r
- InverseOf EmissiveColorOf\r
- HasRange [Color]\r
-\r
-Material <T Entity\r
- [HasDiffuseColor card "1"]\r
- [HasSpecularColor card "1"]\r
- [HasAmbientColor card "1"]\r
- [HasEmissiveColor card "1"]\r
- [HasTransparency card "1"]\r
- [HasShininess card "1"]\r
- Includes\r
- HasDiffuseColor\r
- HasSpecularColor\r
- HasAmbientColor\r
- HasEmissiveColor\r
- HasTransparency\r
- HasShininess\r
- Propagates\r
- HasDiffuseColor\r
- HasSpecularColor\r
- HasAmbientColor\r
- HasEmissiveColor\r
- HasTransparency\r
- HasShininess\r
-TextureCoordinateGenerator <T Property\r
- tag(Enumeration)\r
-HasTextureCoordinateGenerator <R DependsOn\r
- HasRange [TextureCoordinateGenerator]\r
-TextureCoordinateGenerations : Library\r
- ConsistsOf\r
- _sphere @ "sphere" : TextureCoordinateGenerator\r
- _eye_linear @ "eye linear" : TextureCoordinateGenerator\r
- _object_linear @ "object linear" : TextureCoordinateGenerator\r
- _normal @ "normal" : TextureCoordinateGenerator\r
- _reflection @ "reflection" : TextureCoordinateGenerator\r
-\r
-TextureMode @ "MultiTexture Mode" <T Property\r
- tag(Enumeration)\r
- ConsistsOf\r
- mt_add @ "add" : TextureMode\r
- mt_modulate @ "modulate" : TextureMode\r
- mt_blend @ "blend" : TextureMode\r
- mt_decal @ "decal" : TextureMode\r
- mt_replace @ "replace" : TextureMode\r
- mt_combine @ "combine" : TextureMode\r
-HasTextureMode @ "Has Texture Mode" <R DependsOn\r
- HasRange [TextureMode]\r
- \r
-CombineMode <T Property\r
- tag(Enumeration)\r
- ConsistsOf\r
- cm_add @ "add" : CombineMode\r
- cm_replace @ "replace" : CombineMode\r
- cm_modulate @ "modulate" : CombineMode\r
- cm_add_signed @ "add signed" : CombineMode\r
- cm_subtract @ "subtract" : CombineMode\r
- cm_interpolate @ "interpolate" : CombineMode\r
- cm_dot3 @ "dot3" : CombineMode\r
-#HasCombineMode <R DependsOn\r
-# HasRange [CombineMode]\r
- \r
-CombineSource <T Property\r
- tag(Enumeration)\r
- ConsistsOf\r
- cs_object_color @ "object color" : CombineSource\r
- cs_texture_color @ "texture color" : CombineSource\r
- cs_constant_color @ "constant color" : CombineSource\r
- cs_previous_texture_state @ "previous state" : CombineSource\r
- cs_texture0 @ "texture 0" : CombineSource\r
- cs_texture1 @ "texture 1" : CombineSource\r
-#HasCombineSource <R DependsOn\r
-# HasRange [CombineSource]\r
-CombineFunction <T Property\r
- tag(Enumeration)\r
- ConsistsOf\r
- cf_src_color @ "src color" : CombineFunction\r
- cf_one_minus_src_color @ "one minus src color" : CombineFunction\r
- cf_src_alpha @ "src alpha" : CombineFunction\r
- cf_one_minus_src_alpha @ "one minus src alpha" : CombineFunction\r
-#HasCombineFunction <R DependsOn\r
-# HasRange [CombineFunction]\r
-\r
-HasCombineDefinition @ "Has Combine Definition" <R HasProperty\r
- HasRange [LinkedList]\r
- \r
-#MultiTextureElement @ "MultiTextureElement" <T Entity\r
-# [HasTexture card "1"]\r
-\r
-Texture <T Property\r
- [HasTextureMode card "0..1"]\r
- [HasCombineDefinition card "0..1"]\r
- [HasTextureCoordinateGenerator card "0..1"]\r
- #[HasCombineMode card "0..1"]\r
- #[HasCombineSource card "0..1"]\r
- #[HasCombineFunction card "0..1"]\r
- \r
-HasTexture <R DependsOn\r
- HasRange [Texture]\r
- \r
-Texture1D @ "Texture1D" <T Texture\r
-Texture2D @ "Texture2D" <T Texture\r
-Texture3D @ "Texture3D" <T Texture\r
-CubeMapTexture @ "CubeMap Texture" <T Texture\r
- \r
-#MultiTextureElementList @ "MultiTextureElementList" <T LinkedList\r
-#HasMultiTextureElementList @ "Has MultiTextureElementList" <R DependsOn : FunctionalRelation\r
-HasMultiTextureElementList @ "Has MultiTextureElementList" <R HasProperty\r
- HasRange [LinkedList]\r
- #HasRange [MultiTextureElementList]\r
-# this definition is incorrect: multitexture cannot have texturemode,m etc. itself\r
-MultiTexture @ "MultiTexture" <T Texture\r
- [HasMultiTextureElementList card "1"]\r
-HasImage <R DependsOn\r
- HasRange [IMAGE.Image]\r
-ImageTexture @ "ImageTexture" <T Texture2D\r
- [HasImage card "1"]\r
-HasVertexShader <R HasProperty\r
- HasRange [String]\r
-HasFragmentShader <R HasProperty\r
- HasRange [String]\r
-Shader <T Entity\r
- [HasVertexShader card "1"]\r
- [HasFragmentShader card "1"]\r
-HasMaterial <R IsRelatedTo\r
- HasRange [Material]\r
-HasShader <R IsRelatedTo\r
- HasRange [Shader]\r
-Appearance <T Entity\r
- [HasMaterial card "0..1"]\r
- [HasTexture card "0..1"]\r
- [HasShader card "0..1"]\r
- Includes\r
- HasMaterial\r
- HasTexture\r
- HasShader\r
- Propagates\r
- HasMaterial\r
- HasTexture\r
- HasShader\r
-HasAppearance <R HasProperty # HasNonTransformation \r
- HasRange [Appearance]\r
-Shape <T G3DNode\r
- [HasAppearance card "0..1"]\r
- HasDescription "Node for representing geometries" : String\r
- Includes\r
- HasAppearance\r
-G3DModel @ "G3DModel" <T G3DNode\r
- [HasAnimation card "0..*"]\r
- [HasSizingParameter card "0..*"]\r
- Includes\r
- HasAnimation\r
- HasSizingParameter\r
- Propagates\r
- HasAnimation\r
- HasSizingParameter\r
-HasSizingParameter <R HasNonTransformation\r
- HasDescription "Sizing parameters are used for defining parameterization of a model" : String\r
- HasDomain [G3DModel]\r
- HasRange [Double]\r
-HasDefaultDoubleValue <R HasProperty\r
- HasDescription "Sizing Parameter's default value" : String\r
- HasDomain [Double]\r
- HasRange [Double]\r
- \r
-HasConstraints <R HasAdapter2 : FunctionalRelation\r
-\r
-\r
+++ /dev/null
-@echo off\r
-\r
-call "%~dp0..\og\generate2" "%~dp0" 3d.graph\r
+++ /dev/null
-@echo off\r
-\r
-call "%~dp0..\og\generate2" "%~dp0" plant3d_product.graph || goto eof\r
-\r
-:eof
\ No newline at end of file
+++ /dev/null
-scrub=org/simantics/proconf/g3d/stubs=../org.simantics.proconf.g3d/src\r
-scrub=org/simantics/proconf/g3d/csg/stubs=../org.simantics.proconf.g3d.csg/src\r
-scrub=org/simantics/processeditor/stubs=../org.simantics.proconf.processeditor/src\r
-\r
+++ /dev/null
-HasNext\r
-HasPrevious\r
-%import "layer0.graph"\r
-%import "animation.graph"\r
-%import "g3d.graph"\r
-%define symmetric()\r
- $subject\r
- $layer0.InverseOf $subject\r
-%define tag($tagname)\r
- $subject\r
- $tagname $subject\r
-%deflib Type _ @ "Types" : TypeLibrary\r
- PartOf Plant3DOntology\r
-%deflib Relation _ @ "Relations" : RelationLibrary\r
- PartOf Plant3DOntology\r
-%deflib Library Plant3DOntology\r
-Plant3DOntology @ "Plant3D Ontology" : Ontology\r
- PartOf TypeSystemProject\r
- HasNamespace "http://www.vtt.fi/Simantics/Plant3D/1.0" : URI\r
- HasVersion "1.0" : Version\r
- HasResourceClass "org.simantics.processeditor.stubs.Plant3DResource" : String\r
- HasStubsPackage "org.simantics.processeditor.stubs" : String\r
-\r
-Plant3DNamespace : Namespace\r
- PartOf TypeSystemNamespaces\r
- HasNamespace "http://www.vtt.fi/Simantics/Plant3D/1.0" : URI\r
- HasNamespaceRoot Plant3DOntology\r
- \r
-# Project\r
-Plant3DProjectType @ "Plant3DProjectType" <T ProjectType\r
-Plant3DProject @ "Plant3DProject" : Plant3DProjectType <T Project\r
- PartOf ProjectTypes\r
-\r
-\r
-#****************************************************************************\r
-#\r
-# PBS structure and components\r
-#\r
-#****************************************************************************\r
-\r
-P3DNode @ "P3DNode" <T G3DNode\r
- HasDescription "Base node for all 3D plant objects. Used as an identifier." : String\r
-PBSNode <T Entity\r
- HasDescription "Plant Breakdown Structure super type" : String\r
- HasDescription "Example: Site > Plant > Area > Unit" : String\r
- [HasParentStructure card "0..1"]\r
- [HasChildStructure card "0..*"]\r
-HasChildStructure <R IsRelatedTo\r
- InverseOf HasParentStructure\r
- HasDomain [PBSNode]\r
- HasRange [PBSNode]\r
-Plant <T P3DNode <T PBSNode\r
- HasDescription "Root node of the scene-graph" : String\r
- HasDescription "Contains Equipment and Pipe Runs (Scene-graph)" : String\r
- HasDescription "Scene-graph structure IS NOT Plant Breakdown Structure (PBS)" : String\r
-HasGraphics <R IsWeaklyRelatedTo\r
- HasDescription "link to geometric representation of component or equipment" : String\r
- HasRange [G3DModel]\r
-LibraryComponent <T P3DNode <T PBSNode\r
- HasDescription "Base type for librarised components and equipment" : String\r
- [HasGraphics card "0..1"]\r
-Equipment <T LibraryComponent\r
- [HasNozzle card "0..1"]\r
- [HasNozzleDefinition card "0..*"]\r
- [HasNozzleRestriction card "0..1"]\r
-# TODO : PipeRun should link to Spec and use its information\r
-PipeRun <T P3DNode\r
- HasDescription "Non visible node" : String\r
- HasDescription "Contains all pipeline components that contain same specification (size, ..)" : String\r
- [HasPipeDiameter card "1"]\r
- [HasTurnRadius card "1"]\r
- [HasControlPoints card "0..*"]\r
-Nozzle <T LibraryComponent\r
- [HasPipeDiameter card "1"]\r
- [HasLength card "1"]\r
- [HasControlPoint card "0..1"] #0..1 prevents automatic instantion of control point\r
-PipelineComponent <T LibraryComponent\r
- [HasPipeDiameter card "1"]\r
- [HasControlPoint card "0..1"]\r
-SingleConnectedComponent <T PipelineComponent\r
- HasDescription "A component that is connected to only one component" : String\r
-DualConnectedComponent <T PipelineComponent\r
- HasDescription "A component that is connected to two components" : String\r
-MultiConnectedComponent <T PipelineComponent\r
- HasDescription "A component that is connected to more than two components" : String\r
-InlineComponent <T PipelineComponent\r
- HasDescription "Component that connects to two or more components, and maintains direction of (main) " : String\r
- HasDescription "pipe run. Centerline of main pipeline may have offset: with offset there is two control " : String\r
- HasDescription "points for main pipeline, and without offset, there is only one control point for main " : String\r
- HasDescription "pipeline. The component may also join two pipe runs together: then there is always one " : String\r
- HasDescription "control point for one pipe run." : String\r
- [HasLength card "1"]\r
-EndComponent <T PipelineComponent\r
- HasDescription "Component that ends the pipe run" : String\r
- HasDescription "Component may contain other control points" : String\r
-TurnComponent <T PipelineComponent\r
- HasDescription "Component that changes direction of the pipeline" : String\r
- HasDescription "Component that connects to two or more components, and specifies connectivity of main " : String\r
- HasDescription "pipe run. Is base type for elbows, pipe bends, etc., but also for components that won't " : String\r
- HasDescription "maintain main pipeline direction (inline component). CHECK!!!" : String\r
- [HasTurnAngle card "1"]\r
-FixedLengthInlineComponent <T InlineComponent\r
- HasDescription "Inline component that has fixed length" : String\r
- [HasRotationAngle card "1"]\r
-VariableLengthInlineComponent <T InlineComponent\r
- HasDescription "Inline component whose length can be changed" : String\r
-FixedAngleTurnComponent <T TurnComponent\r
- HasDescription "Turn Component that has specific turning angle that cannot be changed" : String\r
- [HasRotationAngle card "1"]\r
-VariableAngleTurnComponent <T TurnComponent\r
- HasDescription "Turn Component whose turning angle can be modified" : String\r
- HasDescription "Contains always one control point (there are no contradictory cases / how to calculate?)" : String\r
- [HasTurnRadius card "1"]\r
-SizeChangeComponent <T FixedLengthInlineComponent\r
- HasDescription "Component that changes pipe run along main pipeline. (Spec change)" : String\r
-OffsetComponent <T FixedLengthInlineComponent\r
- HasDescription "Component that offsets the center of piperun." : String \r
-CodedComponent <T PipelineComponent\r
- HasDescription "Currently used with non-customizable / hard-coded components" : String\r
-NonVisibleComponent <T PipelineComponent\r
- HasDescription "(Pseudo) Component that cannot bee seen." : String\r
-\r
-#****************************************************************************\r
-#\r
-# Pipe Control Points\r
-#\r
-#****************************************************************************\r
-\r
-# control point base type\r
-PipeControlPoint <T Entity\r
- HasDescription "Base type" : String\r
- [HasLocalPosition card "1"]\r
- [HasWorldPosition card "1"]\r
- [HasLocalOrientation card "1"]\r
- [HasWorldOrientation card "1"]\r
- [HasNext card "0..1"]\r
- [HasPrevious card "0..1"]\r
- [HasNext card "0..1"]\r
- [HasSubPoint card "0..*"]\r
- [SubPointOf card "0..1"]\r
- [HasPipeDiameter card "1"]\r
- [ControlPointOf card "0..1"]\r
- [ControlPointOfPipeRun card "0..1"]\r
-\r
-# divide to path leg ends and inline\r
-PathLegEndControlPoint <T PipeControlPoint\r
- HasDescription "A control point that ends path leg." : String\r
-InlineControlPoint <T PipeControlPoint\r
- [HasLength card "1"]\r
-\r
-# turns\r
-TurnControlPoint <T PathLegEndControlPoint\r
- [HasTurnAngle card "1"]\r
- [HasLength card "1"] # TODO : should this be length or something else?\r
- \r
-FixedAngleTurnControlPoint <T TurnControlPoint #is this unnecessary ( Fixed angle could be created with EndComponent + Directed as a subpoint)? \r
- HasDescription "While variable angle turn control point is positioned by path legs, user is responsible for rotating fixed angle turn components." : String\r
- [HasRotationAngle card "1"]\r
- [IsReversed card "1"]\r
-VariableAngleTurnControlPoint <T TurnControlPoint\r
- [HasTurnRadius card "1"]\r
- [HasTurnAxis card "1"] # this was for update purposes\r
-# inline\r
-VariableLengthControlPoint <T InlineControlPoint\r
-FixedLengthControlPoint <T InlineControlPoint\r
- [HasRotationAngle card "1"]\r
-\r
-RunEndControlPoint <T PathLegEndControlPoint\r
- HasDescription "Control Point that ends a PipeRun." : String\r
- HasDescription "Only Next or Previous ControlPoint must be set, and other must be end" : String\r
-\r
-# directed and undirected\r
-\r
-DirectedControlPoint <T RunEndControlPoint\r
- [HasLocalOrientation card "1"]\r
- [HasWorldOrientation card "1"]\r
-# [HasDirection card "1"]\r
-UndirectedControlPoint <T RunEndControlPoint\r
-\r
-EndComponentControlPoint <T UndirectedControlPoint\r
- [HasRotationAngle card "1"]\r
- \r
-# for N-Port components (N > 3), defines position and direction of control point relative to main control point \r
-NPortControlPoint <T DirectedControlPoint\r
-# [HasRelativePosition card "1"]\r
-# [HasRelativeDirection card "1"] \r
-\r
-# Size change & Offset\r
-# TODO: could we allow variable length components that offset piperun ? (currently only component that is variable length is straight pipe, so for now: no) \r
-# note: SizeChange actually ends a piperun, but allows path leg to continue\r
-DualInlineControlPoint <T FixedLengthControlPoint\r
- HasDescription "FixedLengthInlineControlPoint that has subcontrolpoint in the same PipeRun/Pathleg." : String\r
- HasDescription "The previous controlpoint is connected (next) to this point and the next point is connected (previous) to subpoint, while this point and the subpoint are connected both the previous and the next point." : String\r
-SizeChangeControlPoint <T DualInlineControlPoint\r
- HasDescription "Changes PipeRun within the path leg." : String\r
- HasDescription "This CP belongs to the PipeRun that is the previous side and subpoint belongs to the PipeRun that is on the next side." : String \r
-OffsettingPoint <T DualInlineControlPoint\r
- [HasOffset card "1"]\r
- HasDescription "Offsets the center of the pipe." : String \r
-DualSubControlPoint <T FixedLengthControlPoint\r
- HasDescription "DualInlineControlPoint's subpoint." : String\r
-\r
-# nozzle must have its own control point so that we know to link pipe diameters of the nozzle and the piperun\r
-NozzleControlPoint <T DirectedControlPoint\r
-\r
-# TODO : is it necessary to model inline control point that has no length?\r
-BranchEndControlPoint <T UndirectedControlPoint\r
-BranchControlPoint <T FixedLengthControlPoint\r
-\r
-# TODO : we also need a way to specify if control point can be moved from its current place or not (this may be dynamic)\r
- \r
-\r
-# relation and property definitions\r
-\r
-HasControlPoint <R IsRelatedTo\r
- InverseOf ControlPointOf\r
- HasDomain [(PipelineComponent or Nozzle)]\r
- HasRange [PipeControlPoint]\r
- HasDescription "Relation between PipelineComponent and ControlPoint" : String\r
-HasControlPoints <R IsRelatedTo\r
- InverseOf ControlPointOfPipeRun\r
- HasDomain [PipeRun]\r
- HasRange [PipeControlPoint]\r
- HasDescription "Relation between PipeRun and ControlPoint" : String\r
- HasDescription "This is needed because a PipeLineComponent may contain multiple ControlPoints that belong to different PipeRuns." : String\r
-HasNext <R IsWeaklyRelatedTo\r
- HasDomain [PipeControlPoint]\r
- HasRange [PipeControlPoint]\r
- HasDescription "Next point in the piperun" : String\r
-HasPrevious <R IsWeaklyRelatedTo\r
- HasDomain [PipeControlPoint]\r
- HasRange [PipeControlPoint]\r
- HasDescription "Previous point in the piperun" : String\r
-HasSubPoint @ "Has SubPoint" <R IsRelatedTo\r
- InverseOf SubPointOf\r
- HasDomain [PipeControlPoint]\r
- HasRange [PipeControlPoint]\r
- HasDescription "Subcontrolpoint's position is defined by its parent control point. Local Position of subpoint is its position relative to its parent point similar to child/parent relationship in scene-graph." : String \r
-\r
-HasPipeDiameter <R HasNonTransformation\r
- HasRange [Double]\r
-HasLength <R HasNonTransformation\r
- HasRange [Double]\r
-HasTurnAngle <R HasNonTransformation\r
- HasRange [Double]\r
-HasRotationAngle <R HasTransformation\r
- HasRange [Double]\r
-HasOffset <R HasProperty\r
- HasRange [Double]\r
-#HasRelativePosition <R HasProperty\r
-# HasRange [Position]\r
-#HasRelativeDirection <R HasProperty\r
-# HasRange [Tuple3]\r
-#HasDirection <R HasProperty\r
-# HasRange [Tuple3] \r
-HasTurnRadius <R HasNonTransformation\r
- HasRange [Double] \r
-IsReversed <R HasProperty\r
- HasRange [Boolean]\r
-HasTurnAxis <R HasTransformation\r
- HasRange [Tuple3]\r
- \r
-HasNozzleDefinition <R HasProperty\r
- HasDomain [Equipment]\r
- HasRange [Nozzle]\r
- HasDescription "This relation is used to connect nozzles to equipment in the template. For instantiated equipment nozzles must be connected with HasNozzle relation." : String \r
-HasNozzle <R HasChild\r
- InverseOf NozzleOf\r
- HasDomain [Equipment]\r
- HasRange [Nozzle]\r
- HasDescription "Used to connect nozzles to equipment." : String\r
-HasNozzleRestriction <R HasMultiplicity\r
- HasDescription "Used in template equipment to restrict amount of nozzles." : String\r
- HasDescription "If template has as many nozzleDefinitions that maximum count in this restriction, user cannot add new nozzles to the equipment instance." : String\r
-\r
-\r
-\r
-#****************************************************************************\r
-#\r
-# Predefined equipment and components\r
-#\r
-#**************************************************************************** \r
- \r
- \r
-Reducer <T CodedComponent <T SizeChangeComponent <T FixedLengthInlineComponent <T DualConnectedComponent\r
-#ConcentricReducer <T Reducer\r
-#ConcentricReducerImpl : ConcentricReducer\r
-ConcentricReducer <T Reducer : Reducer\r
- PartOf Plant3DOntology\r
- HasRotationAngle "0.0" : Double\r
- HasControlPoint \r
- _ : SizeChangeControlPoint\r
- HasWorldPosition\r
- _ : Position\r
- HasX "0.0" : Double\r
- HasY "0.0" : Double\r
- HasZ "0.0" : Double\r
- HasWorldOrientation\r
- _ : Orientation\r
- HasX "0.0" : Double\r
- HasY "1.0" : Double\r
- HasZ "0.0" : Double\r
- HasAngle "0.0" : Double\r
- HasLocalPosition\r
- _ : Position\r
- HasX "0.0" : Double\r
- HasY "0.0" : Double\r
- HasZ "0.0" : Double\r
- HasLocalOrientation\r
- _ : Orientation\r
- HasX "0.0" : Double\r
- HasY "1.0" : Double\r
- HasZ "0.0" : Double\r
- HasAngle "0.0" : Double\r
- HasSubPoint\r
- _ : DualSubControlPoint\r
- HasWorldPosition\r
- _ : Position\r
- HasX "0.0" : Double\r
- HasY "0.0" : Double\r
- HasZ "0.0" : Double\r
- HasWorldOrientation\r
- _ : Orientation\r
- HasX "0.0" : Double\r
- HasY "1.0" : Double\r
- HasZ "0.0" : Double\r
- HasAngle "0.0" : Double\r
- HasLocalPosition\r
- _ : Position\r
- HasX "0.0" : Double\r
- HasY "0.0" : Double\r
- HasZ "0.0" : Double\r
- HasLocalOrientation\r
- _ : Orientation\r
- HasX "0.0" : Double\r
- HasY "1.0" : Double\r
- HasZ "0.0" : Double\r
- HasAngle "0.0" : Double \r
-#EccentricReducer <T Reducer <T OffsetComponent\r
-#EccentricReducerImpl : EccentricReducer\r
-EccentricReducer <T Reducer <T OffsetComponent : Reducer : OffsetComponent\r
- PartOf Plant3DOntology\r
- HasRotationAngle "0.0" : Double\r
- HasControlPoint \r
- _ : SizeChangeControlPoint : OffsettingPoint\r
- HasOffset "1.0" : Double #TODO : define an equation that can calculate the offset form pipediameters. This requires relative \r
- HasWorldPosition\r
- _ : Position\r
- HasX "0.0" : Double\r
- HasY "0.0" : Double\r
- HasZ "0.0" : Double\r
- HasWorldOrientation\r
- _ : Orientation\r
- HasX "0.0" : Double\r
- HasY "1.0" : Double\r
- HasZ "0.0" : Double\r
- HasAngle "0.0" : Double\r
- HasLocalPosition\r
- _ : Position\r
- HasX "0.0" : Double\r
- HasY "0.0" : Double\r
- HasZ "0.0" : Double\r
- HasLocalOrientation\r
- _ : Orientation\r
- HasX "0.0" : Double\r
- HasY "1.0" : Double\r
- HasZ "0.0" : Double\r
- HasAngle "0.0" : Double\r
- HasSubPoint\r
- _ : DualSubControlPoint\r
- HasWorldPosition\r
- _ : Position\r
- HasX "0.0" : Double\r
- HasY "0.0" : Double\r
- HasZ "0.0" : Double\r
- HasWorldOrientation\r
- _ : Orientation\r
- HasX "0.0" : Double\r
- HasY "1.0" : Double\r
- HasZ "0.0" : Double\r
- HasAngle "0.0" : Double\r
- HasLocalPosition\r
- _ : Position\r
- HasX "0.0" : Double\r
- HasY "0.0" : Double\r
- HasZ "0.0" : Double\r
- HasLocalOrientation\r
- _ : Orientation\r
- HasX "0.0" : Double\r
- HasY "1.0" : Double\r
- HasZ "0.0" : Double\r
- HasAngle "0.0" : Double\r
-#Elbow <T CodedComponent <T VariableAngleTurnComponent <T DualConnectedComponent\r
-#ElbowImpl : Elbow\r
-Elbow <T CodedComponent <T VariableAngleTurnComponent <T DualConnectedComponent : CodedComponent : VariableAngleTurnComponent : DualConnectedComponent\r
- PartOf Plant3DOntology\r
- HasLength "0.0" : Double\r
- HasTurnRadius "0.0" : Double\r
- HasTurnAngle "0.0" : Double\r
- HasControlPoint \r
- _ : VariableAngleTurnControlPoint\r
- HasWorldPosition\r
- _ : Position\r
- HasX "0.0" : Double\r
- HasY "0.0" : Double\r
- HasZ "0.0" : Double\r
- HasWorldOrientation\r
- _ : Orientation\r
- HasX "0.0" : Double\r
- HasY "1.0" : Double\r
- HasZ "0.0" : Double\r
- HasAngle "0.0" : Double\r
- HasLocalPosition\r
- _ : Position\r
- HasX "0.0" : Double\r
- HasY "0.0" : Double\r
- HasZ "0.0" : Double\r
- HasLocalOrientation\r
- _ : Orientation\r
- HasX "0.0" : Double\r
- HasY "1.0" : Double\r
- HasZ "0.0" : Double\r
- HasAngle "0.0" : Double \r
-#Straight <T CodedComponent <T DualConnectedComponent <T VariableLengthInlineComponent\r
-#StraightImpl : Straight\r
-Straight <T CodedComponent <T DualConnectedComponent <T VariableLengthInlineComponent : CodedComponent : DualConnectedComponent : VariableLengthInlineComponent\r
- PartOf Plant3DOntology\r
- HasLength "0.0" : Double\r
- HasControlPoint \r
- _ : VariableLengthControlPoint\r
- HasWorldPosition\r
- _ : Position\r
- HasX "0.0" : Double\r
- HasY "0.0" : Double\r
- HasZ "0.0" : Double\r
- HasWorldOrientation\r
- _ : Orientation\r
- HasX "0.0" : Double\r
- HasY "1.0" : Double\r
- HasZ "0.0" : Double\r
- HasAngle "0.0" : Double\r
- HasLocalPosition\r
- _ : Position\r
- HasX "0.0" : Double\r
- HasY "0.0" : Double\r
- HasZ "0.0" : Double\r
- HasLocalOrientation\r
- _ : Orientation\r
- HasX "0.0" : Double\r
- HasY "1.0" : Double\r
- HasZ "0.0" : Double\r
- HasAngle "0.0" : Double \r
- \r
-BranchSplitComponent <T FixedLengthInlineComponent <T NonVisibleComponent : FixedLengthInlineComponent : NonVisibleComponent \r
- PartOf Plant3DOntology\r
- HasLength "0.0" : Double \r
- HasControlPoint\r
- _ : BranchControlPoint\r
- HasWorldPosition\r
- _ : Position\r
- HasX "0.0" : Double\r
- HasY "0.0" : Double\r
- HasZ "0.0" : Double\r
- HasWorldOrientation\r
- _ : Orientation\r
- HasX "0.0" : Double\r
- HasY "1.0" : Double\r
- HasZ "0.0" : Double\r
- HasAngle "0.0" : Double\r
- HasLocalPosition\r
- _ : Position\r
- HasX "0.0" : Double\r
- HasY "0.0" : Double\r
- HasZ "0.0" : Double\r
- HasLocalOrientation\r
- _ : Orientation\r
- HasX "0.0" : Double\r
- HasY "1.0" : Double\r
- HasZ "0.0" : Double\r
- HasAngle "0.0" : Double\r
- \r
-#Tee <T FixedLengthInlineComponent <T MultiConnectedComponent\r
-#BendPipe <T PipeComponent <T VariableAngleTurnComponent <T DualConnectedComponent\r
-#Cap <T EndComponent\r
-#BlindFlange <T EndComponent\r
-#TwoWayBallValve <T FixedLengthInlineComponent <T DualConnectedComponent\r
-#ThreeWayTTypeBallValve <T FixedLengthInlineComponent <T MultiConnectedComponent\r
-# HasName "Three Way T Type Ball Valve" : String\r
-#ThreeWayYType120DegreeBallValve <T EndComponent <T MultiConnectedComponent\r
-# HasName "Three Way Y Type 120 Degree Ball Valve" : String\r
-Vessel <T Equipment\r
-VerticalVessel <T Vessel\r
- [HasHeight card "1"]\r
-HorizontalVessel <T Vessel\r
- [HasLength card "1"]\r
-\r
-HasHeight <R HasNonTransformation\r
- HasRange [Double]\r
-HasLength <R HasNonTransformation\r
- HasRange [Double]\r
-\r
-#****************************************************************************\r
-#\r
-# Specs \r
-#\r
-#****************************************************************************\r
-\r
+++ /dev/null
-%import "foundation.graph"\r
-\r
-%import "csg.graph"\r
-%import "equation.graph"\r
-%import "plant3d.graph"
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<classpath>\r
- <classpathentry kind="src" path="src"/>\r
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>\r
- <classpathentry kind="output" path="bin"/>\r
-</classpath>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<projectDescription>\r
- <name>org.simantics.g3d.csg</name>\r
- <comment></comment>\r
- <projects>\r
- </projects>\r
- <buildSpec>\r
- <buildCommand>\r
- <name>org.eclipse.jdt.core.javabuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- <buildCommand>\r
- <name>org.eclipse.pde.ManifestBuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- <buildCommand>\r
- <name>org.eclipse.pde.SchemaBuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- </buildSpec>\r
- <natures>\r
- <nature>org.eclipse.pde.PluginNature</nature>\r
- <nature>org.eclipse.jdt.core.javanature</nature>\r
- </natures>\r
-</projectDescription>\r
+++ /dev/null
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Csg Plug-in
-Bundle-SymbolicName: org.simantics.g3d.csg
-Bundle-Version: 0.0.1.qualifier
-Bundle-Activator: org.simantics.proconf.g3d.csg.Activator
-Bundle-Vendor: VTT Technical Research Center of Finland
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.simantics.db,
- org.simantics.g3d;bundle-version="0.0.1",
- org.simantics.layer0.utils,
- org.simantics.layer0;bundle-version="1.0.0",
- org.simantics.utils.datastructures,
- org.simantics.animation
-ipse-LazyStart: true
-Export-Package: org.simantics.proconf.g3d.csg.stubs
+++ /dev/null
-source.. = src/\r
-output.. = bin/\r
-bin.includes = META-INF/,\\r
- .\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.csg;\r
-\r
-import org.eclipse.ui.plugin.AbstractUIPlugin;\r
-import org.osgi.framework.BundleContext;\r
-\r
-/**\r
- * The activator class controls the plug-in life cycle\r
- */\r
-public class Activator extends AbstractUIPlugin {\r
-\r
- // The plug-in ID\r
- public static final String PLUGIN_ID = "fi.vtt.simantics.proconf.g3d.csg";\r
-\r
- // The shared instance\r
- private static Activator plugin;\r
- \r
- /**\r
- * The constructor\r
- */\r
- public Activator() {\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)\r
- */\r
- public void start(BundleContext context) throws Exception {\r
- super.start(context);\r
- plugin = this;\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)\r
- */\r
- public void stop(BundleContext context) throws Exception {\r
- plugin = null;\r
- super.stop(context);\r
- }\r
-\r
- /**\r
- * Returns the shared instance\r
- *\r
- * @return the shared instance\r
- */\r
- public static Activator getDefault() {\r
- return plugin;\r
- }\r
-\r
-}\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<projectDescription>\r
- <name>org.simantics.g3d.feature</name>\r
- <comment></comment>\r
- <projects>\r
- </projects>\r
- <buildSpec>\r
- <buildCommand>\r
- <name>org.eclipse.pde.FeatureBuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- </buildSpec>\r
- <natures>\r
- <nature>org.eclipse.pde.FeatureNature</nature>\r
- </natures>\r
-</projectDescription>\r
+++ /dev/null
-bin.includes = feature.xml\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<feature\r
- id="org.simantics.g3d"\r
- label="Simantics 3D Graphics Framework"\r
- version="0.0.1.qualifier"\r
- provider-name="VTT Technical Research Centre of Finland">\r
-\r
- <description url="http://www.example.com/description">\r
- [Enter Feature Description here.]\r
- </description>\r
-\r
- <copyright url="http://www.example.com/copyright">\r
- [Enter Copyright Description here.]\r
- </copyright>\r
-\r
- <license url="http://www.example.com/license">\r
- [Enter License Description here.]\r
- </license>\r
-\r
- <plugin\r
- id="org.simantics.g3d"\r
- download-size="0"\r
- install-size="0"\r
- version="0.0.0"\r
- unpack="false"/>\r
-\r
- <plugin\r
- id="org.simantics.g3d.occ"\r
- download-size="0"\r
- install-size="0"\r
- version="0.0.0"\r
- unpack="false"/>\r
-\r
- <plugin\r
- id="com.jme.eclipse"\r
- download-size="0"\r
- install-size="0"\r
- version="0.0.0"\r
- unpack="false"/>\r
-\r
- <plugin\r
- id="org.jcae.opencascade.jni"\r
- download-size="0"\r
- install-size="0"\r
- version="0.0.0"/>\r
-\r
- <plugin\r
- id="org.simantics.equation"\r
- download-size="0"\r
- install-size="0"\r
- version="0.0.0"\r
- unpack="false"/>\r
-\r
- <plugin\r
- id="org.simantics.animation"\r
- download-size="0"\r
- install-size="0"\r
- version="0.0.0"\r
- unpack="false"/>\r
-\r
- <plugin\r
- id="org.simantics.g3d.csg"\r
- download-size="0"\r
- install-size="0"\r
- version="0.0.0"\r
- unpack="false"/>\r
-\r
- <plugin\r
- id="org.simantics.g3d.shapeeditor"\r
- download-size="0"\r
- install-size="0"\r
- version="0.0.0"\r
- unpack="false"/>\r
-\r
- <plugin\r
- id="org.simantics.processeditor"\r
- download-size="0"\r
- install-size="0"\r
- version="0.0.0"\r
- unpack="false"/>\r
-\r
-</feature>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<classpath>\r
- <classpathentry kind="src" path="src"/>\r
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>\r
- <classpathentry kind="output" path="bin"/>\r
-</classpath>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<projectDescription>\r
- <name>org.simantics.g3d.occ</name>\r
- <comment></comment>\r
- <projects>\r
- </projects>\r
- <buildSpec>\r
- <buildCommand>\r
- <name>org.eclipse.jdt.core.javabuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- <buildCommand>\r
- <name>org.eclipse.pde.ManifestBuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- <buildCommand>\r
- <name>org.eclipse.pde.SchemaBuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- </buildSpec>\r
- <natures>\r
- <nature>org.eclipse.pde.PluginNature</nature>\r
- <nature>org.eclipse.jdt.core.javanature</nature>\r
- </natures>\r
-</projectDescription>\r
+++ /dev/null
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: G3D OpenCascade Plug-in
-Bundle-SymbolicName: org.simantics.g3d.occ;singleton:=true
-Bundle-Version: 0.0.1.qualifier
-Bundle-Activator: org.simantics.proconf.g3d.occ.Activator
-Bundle-Vendor: VTT Technical Research Center of Finland
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.simantics.g3d;bundle-version="0.0.1",
- org.simantics.g3d.csg;bundle-version="0.0.1",
- com.jme.eclipse,
- javax.vecmath,
- org.jcae.opencascade.jni,
- org.simantics.db,
- org.simantics.db.layer0;bundle-version="1.1.0",
- org.simantics.layer0.utils,
- org.simantics.utils,
- org.simantics.ui;bundle-version="1.0.0"
-Eclipse-LazyStart: true
-Export-Package: org.simantics.proconf.g3d.occ.geometry
+++ /dev/null
-source.. = src/\r
-output.. = bin/\r
-bin.includes = META-INF/,\\r
- .,\\r
- plugin.xml\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<?eclipse version="3.2"?>\r
-<plugin>\r
- <extension\r
- point="org.simantics.proconf.g3d.geometry">\r
- <Geometry\r
- class="org.simantics.proconf.g3d.occ.geometry.OccTriangulator"\r
- id="org.simantics.proconf.g3d.occ.Geometry1">\r
- </Geometry>\r
- </extension>\r
-\r
-</plugin>\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.occ;\r
-\r
-import org.eclipse.ui.plugin.AbstractUIPlugin;\r
-import org.osgi.framework.BundleContext;\r
-import org.simantics.proconf.g3d.csg.stubs.CSGResource;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.proconf.g3d.stubs.G3DResource;\r
-import org.simantics.proconf.ui.ProConfUI;\r
-\r
-/**\r
- * The activator class controls the plug-in life cycle\r
- */\r
-public class Activator extends AbstractUIPlugin {\r
-\r
- // The plug-in ID\r
- public static final String PLUGIN_ID = "org.simantics.proconf.g3d.occ";\r
-\r
- // The shared instance\r
- private static Activator plugin;\r
- \r
- /**\r
- * The constructor\r
- */\r
- public Activator() {\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)\r
- */\r
- public void start(BundleContext context) throws Exception {\r
- super.start(context);\r
- plugin = this;\r
- \r
- ProConfUI.getSession().syncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- OccResources.csgResource = CSGResource.getInstance(g);\r
- OccResources.g3dResource = G3DResource.getInstance(g);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)\r
- */\r
- public void stop(BundleContext context) throws Exception {\r
- plugin = null;\r
- super.stop(context);\r
- }\r
-\r
- /**\r
- * Returns the shared instance\r
- *\r
- * @return the shared instance\r
- */\r
- public static Activator getDefault() {\r
- return plugin;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.occ;\r
-\r
-import org.simantics.proconf.g3d.csg.stubs.CSGResource;\r
-import org.simantics.proconf.g3d.stubs.G3DResource;\r
-\r
-\r
-public class OccResources {\r
- public static CSGResource csgResource;\r
- public static G3DResource g3dResource;\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.occ.geometry;\r
-\r
-\r
-public class IndexedGeometry \r
-{\r
- private float[] coordinates=new float[0];\r
- private float[] tcoordinates=new float[0];\r
- private float[] normals=new float[0];\r
- private int[] indices = new int[0];\r
- private float[] colors=new float[0];\r
- \r
- public IndexedGeometry()\r
- { \r
- }\r
- \r
- \r
- \r
- public int[] getIndices()\r
- {\r
- return indices;\r
- }\r
- \r
- public float[] getCoordinates()\r
- {\r
- return coordinates;\r
- }\r
- \r
- public float[] getTCoordinates()\r
- {\r
- return tcoordinates;\r
- }\r
- \r
- \r
- public void setIndices(int[] value)\r
- {\r
- indices=value;\r
- }\r
- \r
- public void setCoordinates(float[] value)\r
- {\r
- coordinates=value;\r
- }\r
- \r
- public void setTCoordinates(float[] value)\r
- {\r
- tcoordinates=value;\r
- }\r
- \r
- public float[] getColors()\r
- {\r
- return colors;\r
- }\r
- \r
- public void setColors(float[] arg)\r
- {\r
- colors=arg;\r
- }\r
- \r
-\r
- public float[] getNormals()\r
- {\r
- return normals;\r
- }\r
- \r
- public void setNormals(float[] arg)\r
- {\r
- normals=arg;\r
- }\r
-\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.occ.geometry;\r
-\r
-import java.io.IOException;\r
-import java.util.Collection;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.Tuple3d;\r
-import javax.vecmath.Vector2d;\r
-\r
-import org.jcae.opencascade.jni.BRepBuilderAPI_MakeEdge;\r
-import org.jcae.opencascade.jni.BRepBuilderAPI_MakeFace;\r
-import org.jcae.opencascade.jni.BRepBuilderAPI_MakeWire;\r
-import org.jcae.opencascade.jni.BRepBuilderAPI_Transform;\r
-import org.jcae.opencascade.jni.BRepOffsetAPI_ThruSections;\r
-import org.jcae.opencascade.jni.BRepPrimAPI_MakePrism;\r
-import org.jcae.opencascade.jni.BRepPrimAPI_MakeRevol;\r
-import org.jcae.opencascade.jni.BRepPrimAPI_MakeTorus;\r
-import org.jcae.opencascade.jni.BRep_Builder;\r
-import org.jcae.opencascade.jni.GC_MakeArcOfCircle;\r
-import org.jcae.opencascade.jni.GC_MakeSegment;\r
-import org.jcae.opencascade.jni.GP_Elips;\r
-import org.jcae.opencascade.jni.GP_Trsf;\r
-import org.jcae.opencascade.jni.TopoDS_Edge;\r
-import org.jcae.opencascade.jni.TopoDS_Face;\r
-import org.jcae.opencascade.jni.TopoDS_Shape;\r
-import org.jcae.opencascade.jni.TopoDS_Wire;\r
-import org.simantics.proconf.g3d.csg.stubs.Barrel;\r
-import org.simantics.proconf.g3d.csg.stubs.BooleanOperation;\r
-import org.simantics.proconf.g3d.csg.stubs.Box;\r
-import org.simantics.proconf.g3d.csg.stubs.CSGShape;\r
-import org.simantics.proconf.g3d.csg.stubs.Cone;\r
-import org.simantics.proconf.g3d.csg.stubs.Cylinder;\r
-import org.simantics.proconf.g3d.csg.stubs.EllipticCylinder;\r
-import org.simantics.proconf.g3d.csg.stubs.RectangularSolid;\r
-import org.simantics.proconf.g3d.csg.stubs.RegularPrism;\r
-import org.simantics.proconf.g3d.csg.stubs.Sphere;\r
-import org.simantics.proconf.g3d.csg.stubs.Torus;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.GeometryProvider;\r
-import org.simantics.proconf.g3d.occ.OccResources;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-import com.jme.eclipse.test.ply.PLY_Loader;\r
-import com.jme.scene.Geometry;\r
-import com.jme.scene.Line;\r
-import com.jme.scene.TriMesh;\r
-import com.jme.util.geom.BufferUtils;\r
-\r
-public class OccTriangulator implements GeometryProvider{\r
-\r
- \r
- public static final double MIN_VALUE = 0.001;\r
- \r
- public OccTriangulator() {\r
- \r
- }\r
- \r
- \r
- \r
- public boolean canHandle(IEntity instance) {\r
- if (instance.isInstanceOf(OccResources.csgResource.CSGShape)) {\r
- return true;\r
- }\r
- return false;\r
- }\r
- \r
- public Geometry[] getGeometryFromResource(IEntity resource, boolean transform) {\r
- if (resource.isInstanceOf(OccResources.csgResource.CSGShape)) {\r
- TopoDS_Shape shape = OccTriangulator.getShapeFromResource(resource, transform);\r
- Geometry[] g = OccTriangulator.getGeometry(shape);\r
- shape.delete();\r
- return g;\r
- } \r
- return null;\r
- }\r
- \r
- public boolean reconstructGeometry(IEntity instance, boolean transform, Geometry[] geometry) {\r
- if (instance.isInstanceOf(OccResources.csgResource.CSGShape)) {\r
- TopoDS_Shape shape = OccTriangulator.getShapeFromResource(instance, transform);\r
- boolean b = OccTriangulator.getGeometry(shape,geometry);\r
- shape.delete();\r
- return b;\r
- } \r
- return false;\r
- \r
- }\r
-\r
- public static Geometry[] getGeometry(TopoDS_Shape tds_shape) {\r
- Geometry g[] = new Geometry[]{new TriMesh(),new Line()};\r
- if (getGeometry(tds_shape, g))\r
- return g;\r
- return null;\r
- \r
- }\r
- \r
- public static boolean getGeometry(TopoDS_Shape tds_shape, Geometry[] geometry) {\r
- ViewableShapeImpl shape = new ViewableShapeImpl(tds_shape);\r
- //System.out.println("Geometries in shape " + shape.numGeometries());\r
- if (shape.numGeometries() > 0) {\r
- int totalIndicesCount = 0;\r
- int totalVerticesCount = 0;\r
- boolean hasTCoords = true;\r
- for (int geometryIndex = 0; geometryIndex < shape.numGeometries(); geometryIndex++) {\r
- IndexedGeometry geom = shape.getGeometry(geometryIndex);\r
- totalIndicesCount += geom.getIndices().length;\r
- totalVerticesCount += (geom.getCoordinates().length / 3);\r
- if (geom.getTCoordinates() == null || geom.getTCoordinates().length == 0)\r
- hasTCoords = false;\r
- }\r
- int currentVertex = 0;\r
- int currentIndex = 0;\r
- int indices[] = new int[totalIndicesCount];\r
- \r
- \r
- \r
- //TriMesh mesh = new TriMesh();\r
- TriMesh mesh = (TriMesh)geometry[0];\r
- float data[] = new float[totalVerticesCount*3];\r
- float normals[] = new float[totalVerticesCount*3];\r
- float tcoords[] = null;\r
- if (hasTCoords)\r
- tcoords = new float[totalVerticesCount*2];\r
- for (int geometryIndex = 0; geometryIndex < shape.numGeometries(); geometryIndex++) {\r
- IndexedGeometry geom = shape.getGeometry(geometryIndex); \r
- System.arraycopy(geom.getCoordinates(), 0, data, currentVertex*3, geom.getCoordinates().length);\r
- System.arraycopy(geom.getNormals(), 0, normals, currentVertex*3, geom.getCoordinates().length);\r
- if (hasTCoords)\r
- System.arraycopy(geom.getTCoordinates(), 0, tcoords, currentVertex*2, geom.getTCoordinates().length - 1);\r
- \r
- for (int i = 0; i < geom.getIndices().length; i++) {\r
- indices[currentIndex + i] = geom.getIndices()[i] + currentVertex;\r
- }\r
- \r
- currentVertex += geom.getCoordinates().length/3;\r
- currentIndex += geom.getIndices().length;\r
- \r
- }\r
- mesh.reconstruct(BufferUtils.createFloatBuffer(data),BufferUtils.createFloatBuffer(normals) , null, hasTCoords ? BufferUtils.createFloatBuffer(tcoords) : null, BufferUtils.createIntBuffer(indices));\r
- \r
- int numEdgeVertices = 0;\r
- int currentEdgeVertex = 0;\r
- for (int i = 0; i < shape.getNumEdges(); i++) {\r
- numEdgeVertices += shape.getEdge(i).length/3;\r
- }\r
-\r
- Line lines = (Line)geometry[1];\r
- data = new float[numEdgeVertices*3];\r
- for (int i = 0; i < shape.getNumEdges(); i++) {\r
- int index = currentEdgeVertex *3;\r
- System.arraycopy(shape.getEdge(i), 0,data, index, shape.getEdge(i).length);\r
- currentEdgeVertex+= shape.getEdge(i).length/3;\r
- }\r
- lines.reconstruct(BufferUtils.createFloatBuffer(data), null, null, null);\r
- \r
- tds_shape.delete();\r
- return true;\r
- } else {\r
- tds_shape.delete();\r
- return false;\r
- }\r
- }\r
- /*\r
- public static Geometry[] getGeometry(TopoDS_Shape tds_shape) {\r
- return getGeometry(tds_shape,true);\r
- }\r
- */\r
- /*\r
- public static boolean getGeometry(TopoDS_Shape tds_shape, Geometry[] geometry) {\r
- return getGeometry(tds_shape,true, geometry);\r
- }\r
- */\r
- \r
- private static TopoDS_Shape getPrimitiveFromResource(IEntity thing) {\r
- if (!thing.isInstanceOf(OccResources.csgResource.Primitive)) \r
- throw new IllegalArgumentException("Resource is not a primitive");\r
- TopoDS_Shape shape = null;\r
- if (thing.isInstanceOf(OccResources.csgResource.Box)) {\r
- Box box = new Box(thing);\r
- double sx = box.getXAxisSize()[0];\r
- double sy = box.getYAxisSize()[0];\r
- double sz = box.getZAxisSize()[0];\r
- if (sx <= MIN_VALUE)\r
- sx = MIN_VALUE;\r
- if (sy <= MIN_VALUE)\r
- sy = MIN_VALUE;\r
- if (sz <= MIN_VALUE)\r
- sz = MIN_VALUE;\r
- \r
- shape = makeBox(-sx * 0.5, -sy * 0.5, -sz * 0.5, sx * 0.5, sy * 0.5, sz * 0.5);\r
- } else if (thing.isInstanceOf(OccResources.csgResource.Cone)) {\r
- Cone cone = new Cone(thing);\r
- double h = cone.getHeight()[0];\r
- double r1 = cone.getBottomRadius()[0];\r
- double r2 = cone.getTopRadius()[0];\r
- if (Math.abs(r1 - r2) > MIN_VALUE) { // OpenCASCADE won't work,\r
- // if r1 == r2\r
- shape = makeCone(new double[] { 0.0, -h * 0.5, 0.0 }, new double[] { 0.0, 1.0, 0.0 }, r1,\r
- r2, h);\r
- } else {\r
- shape = makeCylinder(new double[] { 0.0, -h * 0.5, 0.0 }, new double[] { 0.0, 1.0, 0.0 },\r
- r1, h);\r
- }\r
- } else if (thing.isInstanceOf(OccResources.csgResource.Sphere)) {\r
- Sphere sphere = new Sphere(thing);\r
- double r = sphere.getRadius()[0];\r
- if (r <= MIN_VALUE)\r
- r = MIN_VALUE;\r
- shape = makeSphere(0.0, 0.0, 0.0, r);\r
- } else if (thing.isInstanceOf(OccResources.csgResource.Torus)) {\r
- Torus torus = new Torus(thing);\r
- double r1 = torus.getMajorRadius()[0];\r
- double r2 = torus.getMinorRadius()[0];\r
- if (r1 <= MIN_VALUE)\r
- r1 = MIN_VALUE;\r
- if (r2 <= MIN_VALUE)\r
- r2 = MIN_VALUE;\r
- shape = makeTorus(new double[] { 0.0, 0.0, 0.0 }, new double[] { 0.0, 1.0, 0.0 }, r1, r2);\r
- } else if (thing.isInstanceOf(OccResources.csgResource.Cylinder)) {\r
- Cylinder cylinder = new Cylinder(thing);\r
- double h = cylinder.getHeight()[0];\r
- double r = cylinder.getRadius()[0];\r
- if (r <= MIN_VALUE)\r
- r = MIN_VALUE;\r
- if (h <= MIN_VALUE)\r
- h = MIN_VALUE;\r
- shape = makeCylinder(new double[] { 0.0, -h * 0.5, 0.0 }, new double[] { 0.0, 1.0, 0.0 }, r, h);\r
- } else if (thing.isInstanceOf(OccResources.csgResource.Barrel)) {\r
- Barrel barrel = new Barrel(thing);\r
- double h = barrel.getHeight()[0];\r
- if (h <= 0.0)\r
- h = 0.01;\r
- double r1 = barrel.getMinorRadius()[0];\r
- if (r1 <= MIN_VALUE)\r
- r1 = MIN_VALUE;\r
- double r2 = barrel.getMajorRadius()[0];\r
- if (r2 <= MIN_VALUE)\r
- r2 = MIN_VALUE;\r
- if (Math.abs(r1 -r2)< MIN_VALUE)\r
- r2 = r1 + MIN_VALUE;\r
- double p0[] = new double[]{0.0,-h*0.5,0.0};\r
- double p1[] = new double[]{0.0,-h*0.5,r1};\r
- double p2[] = new double[]{0.0, 0.0 ,r2};\r
- double p3[] = new double[]{0.0, h*0.5,r1};\r
- double p4[] = new double[]{0.0, h*0.5,0.0};\r
- GC_MakeArcOfCircle m = new GC_MakeArcOfCircle(p1,p2,p3);\r
- GC_MakeSegment s1 = new GC_MakeSegment(p0,p1);\r
- GC_MakeSegment s2 = new GC_MakeSegment(p3,p4);\r
- TopoDS_Edge e1 = (TopoDS_Edge)new BRepBuilderAPI_MakeEdge(s1.value()).shape();\r
- TopoDS_Edge e2 = (TopoDS_Edge)new BRepBuilderAPI_MakeEdge(m.value()).shape();\r
- TopoDS_Edge e3 = (TopoDS_Edge)new BRepBuilderAPI_MakeEdge(s2.value()).shape();\r
- TopoDS_Wire w = (TopoDS_Wire) new BRepBuilderAPI_MakeWire(e1,e2,e3).shape();\r
- TopoDS_Face F = (TopoDS_Face) new BRepBuilderAPI_MakeFace(w).shape();\r
- shape = new BRepPrimAPI_MakeRevol(F,new double[]{0.0,0.0,0.0,0.0,1.0,0.0}).shape();\r
- m.delete();\r
- s1.delete();\r
- s2.delete();\r
- e1.delete();\r
- e2.delete();\r
- e3.delete();\r
- w.delete();\r
- F.delete();\r
- } else if (thing.isInstanceOf(OccResources.csgResource.EllipticCylinder)) {\r
- EllipticCylinder cylinder = new EllipticCylinder(thing);\r
- double h = cylinder.getHeight()[0];\r
- if (h < MIN_VALUE)\r
- h = MIN_VALUE;\r
- double r2 = cylinder.getMinorRadius()[0];\r
- if (r2 < MIN_VALUE)\r
- r2 = MIN_VALUE;\r
- double r1 = cylinder.getMajorRadius()[0];\r
- if (r1 < MIN_VALUE)\r
- r1 = MIN_VALUE;\r
- GP_Elips ellipse;\r
- if (r1 < r2) {\r
- // FIXME : ellipse should be rotated, but current JNI won't allow it since Ax2 is not separate object\r
- ellipse = new GP_Elips(new double[]{0.0,-h*0.5,0.0,0.0,1.0,0.0},r2,r1);\r
- } else {\r
- ellipse = new GP_Elips(new double[]{0.0,-h*0.5,0.0,0.0,1.0,0.0},r1,r2);\r
- }\r
- TopoDS_Edge ed = (TopoDS_Edge) new BRepBuilderAPI_MakeEdge(ellipse).shape();\r
- TopoDS_Wire w = (TopoDS_Wire) new BRepBuilderAPI_MakeWire(ed).shape();\r
- TopoDS_Face F = (TopoDS_Face) new BRepBuilderAPI_MakeFace(w).shape();\r
- shape = new BRepPrimAPI_MakePrism(F, new double[] { 0.0, h, 0.0 }).shape();\r
- ellipse.delete();\r
- ed.delete();\r
- w.delete();\r
- F.delete();\r
- } else if (thing.isInstanceOf(OccResources.csgResource.RegularPrism)) {\r
- RegularPrism prism = new RegularPrism(thing);\r
- int n = prism.getCorners()[0];\r
- if (n < 3)\r
- n = 3;\r
- double h = prism.getHeight()[0];\r
- if (h < MIN_VALUE)\r
- h = MIN_VALUE;\r
- double r = prism.getRadius()[0];\r
- if (r < MIN_VALUE)\r
- r = MIN_VALUE;\r
- Vector2d vertices[] = new Vector2d[n];\r
- for (int i = 0; i < n; i++) {\r
- vertices[i] = new Vector2d(Math.sin(Math.PI * 2.0 * i / n)*r,Math.cos(Math.PI * 2.0 * i / n)*r);\r
- }\r
- BRepBuilderAPI_MakeWire wire = new BRepBuilderAPI_MakeWire();\r
- for (int i = 0; i < n; i++) {\r
- Vector2d v1 = vertices[i];\r
- Vector2d v2 = vertices[(i+1)%n];\r
- wire.add((TopoDS_Edge)new BRepBuilderAPI_MakeEdge(new double[]{v1.x,-h*0.5,v1.y},new double[]{v2.x,-h*0.5,v2.y}).shape());\r
- }\r
- TopoDS_Wire w = (TopoDS_Wire)wire.shape();\r
- TopoDS_Face F = (TopoDS_Face) new BRepBuilderAPI_MakeFace(w).shape();\r
- shape = new BRepPrimAPI_MakePrism(F, new double[] { 0.0, h, 0.0 }).shape(); \r
- wire.delete();\r
- w.delete();\r
- F.delete();\r
- } else if (thing.isInstanceOf(OccResources.csgResource.RectangularSolid)) {\r
- RectangularSolid solid = new RectangularSolid(thing);\r
- double x1 = solid.getXAxisMinimumSize()[0];\r
- double x2 = solid.getXAxisMaximumSize()[0];\r
- double y = solid.getYAxisSize()[0];\r
- double z1 = solid.getZAxisMinimumSize()[0];\r
- double z2 = solid.getZAxisMaximumSize()[0];\r
- if (x1 < MIN_VALUE)\r
- x1 = MIN_VALUE;\r
- if (x2 < MIN_VALUE)\r
- x2 = MIN_VALUE;\r
- if (y < MIN_VALUE)\r
- y = MIN_VALUE;\r
- if (z1 < MIN_VALUE)\r
- z1 = MIN_VALUE;\r
- if (z2 < MIN_VALUE)\r
- z2 = MIN_VALUE;\r
- x1 *= 0.5;\r
- x2 *= 0.5;\r
- y *= 0.5;\r
- z1 *= 0.5;\r
- z2 *= 0.5;\r
- \r
- BRepBuilderAPI_MakeWire wire = new BRepBuilderAPI_MakeWire();\r
- wire.add((TopoDS_Edge)new BRepBuilderAPI_MakeEdge(new double[]{x1,-y,z1},new double[]{x1,-y,-z1}).shape());\r
- wire.add((TopoDS_Edge)new BRepBuilderAPI_MakeEdge(new double[]{x1,-y,-z1},new double[]{-x1,-y,-z1}).shape());\r
- wire.add((TopoDS_Edge)new BRepBuilderAPI_MakeEdge(new double[]{-x1,-y,-z1},new double[]{-x1,-y,z1}).shape());\r
- wire.add((TopoDS_Edge)new BRepBuilderAPI_MakeEdge(new double[]{-x1,-y,z1},new double[]{x1,-y,z1}).shape());\r
- TopoDS_Wire w1 = (TopoDS_Wire)wire.shape();\r
- wire.delete();\r
- wire = new BRepBuilderAPI_MakeWire();\r
- wire.add((TopoDS_Edge)new BRepBuilderAPI_MakeEdge(new double[]{x2, y,z2},new double[]{x2, y,-z2}).shape());\r
- wire.add((TopoDS_Edge)new BRepBuilderAPI_MakeEdge(new double[]{x2, y,-z2},new double[]{-x2, y,-z2}).shape());\r
- wire.add((TopoDS_Edge)new BRepBuilderAPI_MakeEdge(new double[]{-x2, y,-z2},new double[]{-x2, y,z2}).shape());\r
- wire.add((TopoDS_Edge)new BRepBuilderAPI_MakeEdge(new double[]{-x2, y,z2},new double[]{x2, y,z2}).shape());\r
- TopoDS_Wire w2 = (TopoDS_Wire)wire.shape();\r
- BRepOffsetAPI_ThruSections generatorb = new BRepOffsetAPI_ThruSections(true, true);\r
- generatorb.addWire(w1);\r
- generatorb.addWire(w2);\r
- generatorb.build();\r
- shape = generatorb.shape();\r
- wire.delete();\r
- w1.delete();\r
- w2.delete();\r
- } else {\r
- throw new UnsupportedOperationException("Unsupported primitive");\r
-\r
- }\r
- return shape;\r
- }\r
- \r
- private static TopoDS_Shape getBooleanOp(IEntity thing, TopoDS_Shape topoDSshape1, TopoDS_Shape topoDSshape2) {\r
- if (!thing.isInstanceOf(OccResources.csgResource.BooleanOperation))\r
- throw new IllegalArgumentException("Resource is not a boolean operation");\r
- TopoDS_Shape shape = null;\r
- int type;\r
- if (thing.isInstanceOf(OccResources.csgResource.Difference)) {\r
- type = 0;\r
- } else if (thing.isInstanceOf(OccResources.csgResource.Union)) {\r
- type = 1;\r
- } else if (thing.isInstanceOf(OccResources.csgResource.Intersection)) {\r
- type = 2;\r
- } else {\r
- throw new UnsupportedOperationException("Unsupported boolean operation");\r
- }\r
- \r
- switch (type) {\r
- case 0:\r
- shape = makeCut(topoDSshape1, topoDSshape2);\r
- break;\r
- case 1:\r
- shape = makeFuse(topoDSshape1, topoDSshape2);\r
- break;\r
- case 2:\r
- shape = makeCommon(topoDSshape1, topoDSshape2);\r
- break;\r
- }\r
- topoDSshape1.delete();\r
- topoDSshape2.delete();\r
- return shape;\r
- }\r
- \r
- private static TopoDS_Shape getBooleanOpFromResource(IEntity thing) {\r
- if (!thing.isInstanceOf(OccResources.csgResource.BooleanOperation))\r
- throw new IllegalArgumentException("Resource is not a boolean operation");\r
- \r
- TopoDS_Shape shape = null;\r
- TopoDS_Shape topoDSshape1 = null;\r
- TopoDS_Shape topoDSshape2 = null;\r
- BooleanOperation op = new BooleanOperation(thing);\r
- CSGShape mainShape = op.getMainShape();\r
- Collection<CSGShape> secondaryShapes = op.getSecondaryShape();\r
- if (mainShape == null || secondaryShapes.size() < 1) {\r
- throw new RuntimeException("Cannot find requested Shapes for boolean operation");\r
- }\r
- topoDSshape1 = getShapeFromResource(mainShape);\r
- for (CSGShape shape2 : secondaryShapes) {\r
- topoDSshape2 = getShapeFromResource(shape2);\r
- shape = getBooleanOp(thing,topoDSshape1,topoDSshape2);\r
- topoDSshape1.delete();\r
- topoDSshape1 = shape;\r
- }\r
- \r
- topoDSshape2.delete();\r
- return shape;\r
- }\r
-\r
- private static TopoDS_Shape getShapeFromResource(IEntity thing) {\r
- return getShapeFromResource(thing, true);\r
- }\r
- \r
- private static TopoDS_Shape getShapeFromResource(IEntity thing, boolean transform) {\r
- if (thing.isInstanceOf(OccResources.csgResource.CSGShape)) {\r
- TopoDS_Shape shape = null;\r
- \r
- if (thing.isInstanceOf(OccResources.csgResource.Primitive)) {\r
- shape = getPrimitiveFromResource(thing);\r
-\r
- } else if (thing.isInstanceOf(OccResources.csgResource.BooleanOperation)) {\r
- shape = getBooleanOpFromResource(thing);\r
-\r
- } else {\r
- throw new UnsupportedOperationException("Shape must be a primitive or a boolean operation");\r
- }\r
- Tuple3d c = null;\r
- CSGShape shapeType = new CSGShape(thing);\r
- \r
- if (shapeType.getCenter() != null)\r
- c = G3DTools.getVector(shapeType.getCenter());\r
- \r
- TopoDS_Shape tShape = null;\r
- if(c != null) {\r
- tShape = makeTranslation(shape, c.x, c.y, c.z);\r
- shape.delete();\r
- shape = tShape;\r
- }\r
- if (transform) {\r
- //CSGShape shapeType = CSGShapeFactory.create(resource);\r
- Tuple3d p = G3DTools.getVector(shapeType.getLocalPosition());\r
- AxisAngle4d r = G3DTools.getOrientation(shapeType.getLocalOrientation());\r
- \r
- if (Math.abs(r.angle) > 0.01) {\r
- tShape = makeRotation(shape, new double[] { 0.0, 0.0, 0.0, r.x, r.y, r.z }, r.angle);\r
- shape.delete();\r
- shape = tShape;\r
- }\r
- tShape = makeTranslation(shape, p.x, p.y, p.z);\r
- shape.delete();\r
- shape = tShape;\r
- }\r
-\r
- return shape;\r
-\r
- }\r
- throw new UnsupportedOperationException("Resource is not a shape");\r
- }\r
-\r
- private static TopoDS_Shape getShapeFromFile(String filename) {\r
- assert (filename != null);\r
- if (filename.endsWith("stp")) {\r
- TopoDS_Shape shape = importSTEP(filename);\r
- return shape;\r
- } else if (filename.endsWith("step")) {\r
- TopoDS_Shape shape = importSTEP(filename);\r
- return shape;\r
- } else if (filename.endsWith("iges")) {\r
- TopoDS_Shape shape = importIGES(filename);\r
- return shape;\r
- } else if (filename.endsWith("brep")) {\r
- TopoDS_Shape shape = importBREP(filename);\r
- return shape;\r
- } else {\r
- throw new UnsupportedOperationException("Unsupported format " + filename);\r
- }\r
-\r
- }\r
-\r
- \r
-\r
- public static Geometry[] getGeometryFromFile(String filename) {\r
- if (filename.endsWith("ply")) {\r
- try {\r
- return new Geometry[]{PLY_Loader.loadPLY(filename)};\r
- } catch (IOException e) {\r
- ErrorLogger.defaultLogError(e);\r
- return null;\r
- }\r
- }\r
- TopoDS_Shape shape = OccTriangulator.getShapeFromFile(filename);\r
- Geometry g[] = OccTriangulator.getGeometry(shape);\r
- shape.delete();\r
- return g;\r
- }\r
- \r
- public static TopoDS_Shape importBREP(String filename) {\r
- org.jcae.opencascade.jni.BRep_Builder aBuilder = new org.jcae.opencascade.jni.BRep_Builder();\r
- org.jcae.opencascade.jni.TopoDS_Shape myShape = org.jcae.opencascade.jni.BRepTools.read(filename, aBuilder);\r
- aBuilder.delete();\r
- return myShape;\r
- }\r
-\r
- public static TopoDS_Shape importIGES(String filename) {\r
- org.jcae.opencascade.jni.IGESControl_Reader aReader = new org.jcae.opencascade.jni.IGESControl_Reader();\r
- aReader.readFile(filename);\r
- aReader.clearShapes();\r
- aReader.transferRoots();\r
- TopoDS_Shape result = aReader.oneShape();\r
- aReader.delete();\r
- return result;\r
- }\r
- \r
- public static TopoDS_Shape importSTEP(String filename) {\r
- org.jcae.opencascade.jni.STEPControl_Reader aReader = new org.jcae.opencascade.jni.STEPControl_Reader();\r
- aReader.readFile(filename);\r
- aReader.clearShapes();\r
- aReader.transferRoots();\r
- TopoDS_Shape result = aReader.oneShape();\r
- aReader.delete();\r
- return result;\r
- }\r
-\r
- public static TopoDS_Shape archimede(TopoDS_Shape topoDS_Shape, double param, double param2, double param3) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape suppressHolesInFaceOrShell(TopoDS_Shape topoDS_Shape, TopoDS_Shape[] topoDS_Shape1) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape suppressHole(TopoDS_Shape topoDS_Shape, TopoDS_Shape[] topoDS_Shape1,\r
- TopoDS_Shape[] topoDS_Shape2, TopoDS_Shape[] topoDS_Shape3) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape[] suppressFaces(TopoDS_Shape topoDS_Shape, TopoDS_Shape[] topoDS_Shape1) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape[] subShapeAll(TopoDS_Shape topoDS_Shape, short param) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape subShape(TopoDS_Shape topoDS_Shape, short param, TopoDS_Shape[] topoDS_Shape2) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static boolean setBlock(TopoDS_Shape topoDS_Shape) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape partitionKeepFaces(TopoDS_Shape[] topoDS_Shape, TopoDS_Shape topoDS_Shape1, boolean param) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape orientationChange(TopoDS_Shape topoDS_Shape) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static short nbLabels() {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeWire(TopoDS_Shape[] topoDS_Shape) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeVertex(double param, double param1, double param2) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeVector(double[] pointStruct, double[] pointStruct1) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeTranslation(TopoDS_Shape aShape, double x, double y, double z) {\r
- GP_Trsf theTransformation = new GP_Trsf();\r
- theTransformation.setTranslation(new double[] { x, y, z });\r
- BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true);\r
-\r
- TopoDS_Shape shape = bt.shape();\r
- bt.delete();\r
- theTransformation.delete();\r
- return shape;\r
- }\r
-\r
- public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double r1, double r2) {\r
- double[] axe = new double[6];\r
- System.arraycopy(pointStruct, 0, axe, 0, 3);\r
- System.arraycopy(dirStruct, 0, axe, 3, 3);\r
- org.jcae.opencascade.jni.TopoDS_Shape tds = new BRepPrimAPI_MakeTorus(axe, r1, r2).shape();\r
- return tds;\r
- }\r
-\r
- public static TopoDS_Shape makeSphere(double x, double y, double z, double radius) {\r
- double[] c = new double[] { x, y, z };\r
- org.jcae.opencascade.jni.TopoDS_Shape tds = new org.jcae.opencascade.jni.BRepPrimAPI_MakeSphere(c, radius)\r
- .shape();\r
- return tds;\r
- }\r
-\r
- public static TopoDS_Shape makeSewingShape(TopoDS_Shape topoDS_Shape, double param) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeSewing(TopoDS_Shape[] topoDS_Shape, double param) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeScaleTransform(TopoDS_Shape topoDS_Shape, double[] pointStruct, double param) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeRotation(TopoDS_Shape aShape, double[] axisStruct, double angle) {\r
-\r
- GP_Trsf theTransformation = new GP_Trsf();\r
- theTransformation.setRotation(axisStruct, angle);\r
- BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true);\r
- TopoDS_Shape shape = bt.shape();\r
- bt.delete();\r
- theTransformation.delete();\r
- return shape;\r
- }\r
-\r
- public static TopoDS_Shape makeRevolution(TopoDS_Shape topoDS_Shape, double[] axisStruct, double param) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makePrism(TopoDS_Shape topoDS_Shape, double[] pointStruct, double[] pointStruct2) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makePlane(double[] pointStruct, double[] dirStruct, double param) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makePlacedBox(double param, double param1, double param2, double param3, double param4,\r
- double param5) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makePipe(TopoDS_Shape topoDS_Shape, TopoDS_Shape topoDS_Shape1) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makePanel(TopoDS_Shape topoDS_Shape, short param, double param2) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeMultiTranslation2D(TopoDS_Shape topoDS_Shape, double[] dirStruct, double param,\r
- short param3, double[] dirStruct4, double param5, short param6) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeMultiTranslation1D(TopoDS_Shape topoDS_Shape, double[] dirStruct, double param, short param3) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeMultiRotation2D(TopoDS_Shape topoDS_Shape, double[] dirStruct, double[] pointStruct,\r
- double param, short param4, double param5, short param6) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeMultiRotation1D(TopoDS_Shape topoDS_Shape, double[] dirStruct, double[] pointStruct,\r
- short param) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeMirrorByPlane(TopoDS_Shape topoDS_Shape, TopoDS_Shape topoDS_Shape1) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeLine(double[] pointStruct, double[] dirStruct) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeFilling(TopoDS_Shape topoDS_Shape, short param, short param2, double param3, double param4,\r
- short param5) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeFillet(TopoDS_Shape topoDS_Shape, double param, short param2, TopoDS_Shape[] topoDS_Shape3) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeFace(TopoDS_Shape topoDS_Shape, boolean param) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeEdge(double[] pointStruct, double[] pointStruct1) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeCylinder(double[] pointStruct, double[] dirStruct, double radius, double height) {\r
- double[] axe = new double[6];\r
- System.arraycopy(pointStruct, 0, axe, 0, 3);\r
- System.arraycopy(dirStruct, 0, axe, 3, 3);\r
- org.jcae.opencascade.jni.TopoDS_Shape tds = new org.jcae.opencascade.jni.BRepPrimAPI_MakeCylinder(axe, radius,\r
- height, 2 * Math.PI).shape();\r
- return tds;\r
- }\r
-\r
- public static TopoDS_Shape makeCopy(TopoDS_Shape topoDS_Shape) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeCone(double[] pointStruct, double[] dirStruct, double radius1, double radius2, double height) {\r
- double[] axe = new double[6];\r
- System.arraycopy(pointStruct, 0, axe, 0, 3);\r
- System.arraycopy(dirStruct, 0, axe, 3, 3);\r
- org.jcae.opencascade.jni.TopoDS_Shape tds = new org.jcae.opencascade.jni.BRepPrimAPI_MakeCone(axe, radius1,\r
- radius2, height, 2 * Math.PI).shape();\r
- return tds;\r
- }\r
-\r
- public static TopoDS_Shape makeCompound(TopoDS_Shape[] shapes) {\r
- BRep_Builder builder = new BRep_Builder();\r
- org.jcae.opencascade.jni.TopoDS_Compound comp = new org.jcae.opencascade.jni.TopoDS_Compound();\r
- builder.makeCompound(comp);\r
- for (int i = 0; i < shapes.length; i++) {\r
-\r
- builder.add(comp, shapes[i]);\r
- }\r
- builder.delete();\r
- return comp;\r
- }\r
-\r
- public static TopoDS_Shape makeCircle(double[] pointStruct, double[] dirStruct, double param) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeChamfer(TopoDS_Shape topoDS_Shape, double param, double param2, short param3,\r
- TopoDS_Shape[] topoDS_Shape4) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeCDG(TopoDS_Shape topoDS_Shape) {\r
- throw new UnsupportedOperationException();\r
- }\r
-\r
- public static TopoDS_Shape makeBox(double x1, double y1, double z1, double x2, double y2, double z2) {\r
- double[] p1 = new double[] { x1, y1, z1 };\r
- double[] p2 = new double[] { x2, y2, z2 };\r
- org.jcae.opencascade.jni.TopoDS_Shape tds = new org.jcae.opencascade.jni.BRepPrimAPI_MakeBox(p1, p2).shape();\r
- return tds;\r
- }\r
-\r
- public static TopoDS_Shape makeCut(TopoDS_Shape shape1, TopoDS_Shape shape2) {\r
-\r
- org.jcae.opencascade.jni.TopoDS_Shape s = new org.jcae.opencascade.jni.BRepAlgoAPI_Cut(shape1, shape2).shape();\r
- return s;\r
- }\r
- \r
- public static TopoDS_Shape makeCommon(TopoDS_Shape shape1, TopoDS_Shape shape2) {\r
-\r
- org.jcae.opencascade.jni.TopoDS_Shape s = new org.jcae.opencascade.jni.BRepAlgoAPI_Common(shape1, shape2).shape();\r
- return s;\r
- }\r
- \r
- public static TopoDS_Shape makeFuse(TopoDS_Shape shape1, TopoDS_Shape shape2) {\r
-\r
- org.jcae.opencascade.jni.TopoDS_Shape s = new org.jcae.opencascade.jni.BRepAlgoAPI_Fuse(shape1, shape2).shape();\r
- return s;\r
- }\r
-\r
- public static TopoDS_Shape makeArc(double[] pointStruct, double[] pointStruct1, double[] pointStruct2) {\r
- throw new UnsupportedOperationException();\r
- }\r
- \r
- public static TopoDS_Shape makeWedge(double[] pointStruct, double[] dirStruct,double dx, double dy, double dz, double xmin, double zmin, double xmax, double zmax) {\r
- double[] axe = new double[6];\r
- System.arraycopy(pointStruct, 0, axe, 0, 3);\r
- System.arraycopy(dirStruct, 0, axe, 3, 3);\r
- org.jcae.opencascade.jni.TopoDS_Shape s = new org.jcae.opencascade.jni.BRepPrimAPI_MakeWedge(axe, dx, dy, dz, xmin, zmin, xmax, zmax).shape();\r
- return s;\r
- }\r
-\r
- \r
-\r
- public static void exportBREP(TopoDS_Shape shape, String filename) {\r
- org.jcae.opencascade.jni.BRepTools.write(shape, filename);\r
- }\r
-\r
- public static void exportIGES(TopoDS_Shape shape, String filename) {\r
- throw new UnsupportedOperationException();\r
- \r
-// IGESControl_Writer writer=new IGESControl_Writer();\r
-// writer.addShape(shape); writer.write(filename,false);\r
- \r
- }\r
-\r
-\r
-\r
-\r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-/* \r
- This class is combination of jCAE's classes to generate meshes from shapes.\r
- Faces are lisetd as individual meshes.\r
- \r
- Marko Luukkainen\r
- \r
- jCAE stand for Java Computer Aided Engineering. Features are : Small CAD\r
- modeler, Finit element mesher, Plugin architecture.\r
-\r
- Copyright (C) 2003 Jerome Robert <jeromerobert@users.sourceforge.net>\r
-\r
- This library is free software; you can redistribute it and/or\r
- modify it under the terms of the GNU Lesser General Public\r
- License as published by the Free Software Foundation; either\r
- version 2.1 of the License, or (at your option) any later version.\r
-\r
- This library is distributed in the hope that it will be useful,\r
- but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
- Lesser General Public License for more details.\r
-\r
- You should have received a copy of the GNU Lesser General Public\r
- License along with this library; if not, write to the Free Software\r
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
- */\r
-\r
-package org.simantics.proconf.g3d.occ.geometry;\r
-import org.jcae.opencascade.jni.BRepBndLib;\r
-import org.jcae.opencascade.jni.BRepMesh_IncrementalMesh;\r
-import org.jcae.opencascade.jni.BRepTools;\r
-import org.jcae.opencascade.jni.BRep_Tool;\r
-import org.jcae.opencascade.jni.Bnd_Box;\r
-import org.jcae.opencascade.jni.GCPnts_UniformDeflection;\r
-import org.jcae.opencascade.jni.GP_Trsf;\r
-import org.jcae.opencascade.jni.GeomAPI_ProjectPointOnSurf;\r
-import org.jcae.opencascade.jni.GeomAdaptor_Curve;\r
-import org.jcae.opencascade.jni.GeomLProp_SLProps;\r
-import org.jcae.opencascade.jni.Geom_Curve;\r
-import org.jcae.opencascade.jni.Geom_Surface;\r
-import org.jcae.opencascade.jni.Poly_Triangulation;\r
-import org.jcae.opencascade.jni.TopAbs_Orientation;\r
-import org.jcae.opencascade.jni.TopAbs_ShapeEnum;\r
-import org.jcae.opencascade.jni.TopExp_Explorer;\r
-import org.jcae.opencascade.jni.TopLoc_Location;\r
-import org.jcae.opencascade.jni.TopoDS_Edge;\r
-import org.jcae.opencascade.jni.TopoDS_Face;\r
-import org.jcae.opencascade.jni.TopoDS_Shape;\r
-import org.jcae.opencascade.jni.TopoDS_Vertex;\r
-\r
-\r
-import java.util.ArrayList;\r
-import java.util.HashSet;\r
-\r
-import javax.vecmath.Matrix4d;\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Vector3f;\r
-\r
-\r
-public class ViewableShapeImpl \r
-{\r
-\r
- \r
- ArrayList<IndexedGeometry> faceMeshes =new ArrayList<IndexedGeometry>();\r
- ArrayList<float[]> edges=new ArrayList<float[]>();\r
-\r
- public ViewableShapeImpl(TopoDS_Shape g)\r
- {\r
- BRepTools.clean(g);\r
- buildFaces(g);\r
- buildEdges(g);\r
- \r
- }\r
- /*\r
- public ViewableShapeImpl(TopoDS_Shape g, boolean alternative)\r
- {\r
- \r
- if (alternative) \r
- buildFaces(g);\r
- else {\r
- BRepTools.clean(g);\r
- buildFaces2(g);\r
- }\r
- \r
- buildEdges(g);\r
- \r
- }\r
- */\r
- \r
- public IndexedGeometry getGeometry(int i)\r
- { \r
- return faceMeshes.get(i);\r
- }\r
- \r
- public int numGeometries()\r
- {\r
- return faceMeshes.size();\r
-\r
- } \r
- \r
- public int getNumEdges() {\r
- return edges.size();\r
- }\r
- \r
- public float[] getEdge(int i) {\r
- return edges.get(i);\r
- }\r
- \r
- /**\r
- * org.jcae.viewer3d.cad.occ.OCCEdgeDomain\r
- * @param shape\r
- * @param geom\r
- */\r
- private void buildFaces(TopoDS_Shape shape) {\r
- TopExp_Explorer explorer = new TopExp_Explorer();\r
- TopLoc_Location loc = new TopLoc_Location();\r
- \r
- int meshIter=4;\r
- double deflection = deflection(shape);\r
- for (explorer.init(shape, TopAbs_ShapeEnum.FACE); explorer.more(); explorer.next())\r
- { \r
- //System.out.println("Triangulation");\r
- TopoDS_Shape s = explorer.current();\r
- if (!(s instanceof TopoDS_Face)) continue; // should not happen!\r
- TopoDS_Face face = (TopoDS_Face)s;\r
- Poly_Triangulation pt = BRep_Tool.triangulation(face,loc);\r
- \r
- //float error=0.01f;\r
- double error = deflection;\r
- int iter=0;\r
- // if shape was generated with program triangulation seems to be always null,\r
- // but model is loaded from file, it may already contain triangulation\r
- // So : in those cases can we delete existing triangulation and generate a new one ?\r
- //if (pt == null) {\r
- //System.out.println("Initial triangulation of face "+face+" not found. Using Incremental mesh");\r
- //} else {\r
- //System.out.println("Initial triangulation of face "+face+" found.");\r
- //}\r
- while((pt==null)&(iter<meshIter)){\r
- //System.out.println("Triangulation failed for face "+face+". Trying other mesh parameters.");\r
- \r
- // using relatif in incremental mesh would cause visible seams between faces\r
- BRepMesh_IncrementalMesh m = new BRepMesh_IncrementalMesh(face,error, false);\r
- //new BRepMesh_IncrementalMesh(face,error, false,12.0);\r
- pt = BRep_Tool.triangulation(face,loc); \r
- error/=10;\r
- iter++;\r
- m.delete();\r
- \r
- }\r
- \r
- \r
- if (pt==null)\r
- {\r
- System.out.println("Triangulation failed for face "+face+". Mesh not generated.");\r
- continue;\r
- \r
- }\r
- \r
- GP_Trsf trsf = loc.transformation();\r
- double[] mat = new double[16];\r
- trsf.getValues(mat);\r
- Matrix4d m = new Matrix4d(mat);\r
- \r
- double[] dnodes = pt.nodes();\r
- final int[] itriangles = pt.triangles(); \r
- boolean useNormals = false;\r
- boolean useTCoord = false;\r
- \r
- float[] tnodes = null;\r
- float[] normals = null;\r
- \r
- if (useTCoord)\r
- tnodes = new float[dnodes.length / 3 * 2];\r
- if (useNormals)\r
- normals= new float[dnodes.length];\r
- GeomLProp_SLProps prop = new GeomLProp_SLProps(2,0.001);\r
- Geom_Surface surf = BRep_Tool.surface(face);\r
- prop.setSurface(surf);\r
- if (useTCoord || useNormals) {\r
- for (int i = 0; i < dnodes.length; i += 3) {\r
- double UV[] = new double[2];\r
- double point[] = new double[] { dnodes[i], dnodes[i + 1],\r
- dnodes[i + 2] };\r
- GeomAPI_ProjectPointOnSurf pof = new GeomAPI_ProjectPointOnSurf(\r
- point, surf);\r
- pof.lowerDistanceParameters(UV);\r
- // boolean b = GeomLib_Tool.parameters(surf, point, 0.01,\r
- // UV);\r
- prop.setParameters(UV[0], UV[1]);\r
- if (useNormals) {\r
- double normal[] = prop.normal();\r
- normals[i] = (float) normal[0];\r
- normals[i + 1] = (float) normal[1];\r
- normals[i + 2] = (float) normal[2];\r
- }\r
- if (useTCoord) {\r
- int index = i / 3 * 2;\r
- tnodes[index] = (float) UV[0];\r
- tnodes[index + 1] = (float) UV[1];\r
- }\r
- // System.out.println(dnodes[i]+ " " +dnodes[i+1]+ " "\r
- // +dnodes[i+2]+ " " + " UV:" + UV[0] + ","+UV[1]+ " " + b);\r
- // System.out.println(dnodes[i]+ " " +dnodes[i+1]+ " "\r
- // +dnodes[i+2]+ " " + normals[i] + " " + normals[i+1] + " "\r
- // + normals[i+2] + " UV:" + UV[0] + ","+UV[1]);\r
- }\r
- }\r
- prop.delete();\r
- \r
- if(face.orientation()==TopAbs_Orientation.REVERSED)\r
- {\r
- flipFace(itriangles);\r
- }\r
- \r
- final float[] fnodes=createFloatVertices(dnodes, m);\r
- IndexedGeometry geom = new IndexedGeometry();\r
- geom.setCoordinates(fnodes);\r
- geom.setIndices(itriangles);\r
- geom.setNormals(calcNormals(fnodes,itriangles));\r
- if (useNormals)\r
- geom.setNormals(normals);\r
- if (useTCoord)\r
- geom.setTCoordinates(tnodes);\r
- faceMeshes.add(geom);\r
- //System.out.println("Triangulation done");\r
- }\r
- }\r
- \r
- /**\r
- * org.jcae.viewer3d.cad.occ.OCCEdgeDomain\r
- * @param shape\r
- * @param geom\r
- */\r
- /*\r
- private void buildFaces2(TopoDS_Shape shape) {\r
-\r
- TopExp_Explorer explorer = new TopExp_Explorer();\r
- TopLoc_Location loc = new TopLoc_Location();\r
- \r
- int meshIter=10;\r
- \r
- for (explorer.init(shape, TopAbs_ShapeEnum.FACE); explorer.more(); explorer.next())\r
- { \r
- TopoDS_Shape s = explorer.current();\r
- if (!(s instanceof TopoDS_Face)) continue; // should not happen!\r
- TopoDS_Face face = (TopoDS_Face)s;\r
- \r
- double error=0.01;\r
- BRepMesh_Discret mesh = new BRepMesh_Discret(0.01,face,0.1,true,true);\r
- Poly_Triangulation pt = BRep_Tool.triangulation(face,loc);\r
- //float error=0.001f*getMaxBound(s)*4;\r
- \r
- if (pt == null) {\r
- System.out.println("Triangulation failed for face "+face+". Using Incremental mesh");\r
- }\r
- \r
- int iter=0;\r
- while((pt==null)&(iter<meshIter)){\r
- BRepMesh_IncrementalMesh m = new BRepMesh_IncrementalMesh(face,error, false);\r
- //new BRepMesh_IncrementalMesh(face,error, true);\r
- pt = BRep_Tool.triangulation(face,loc); \r
- error/=100;\r
- iter++;\r
- System.out.println("Triangulation failed for face "+face+". Trying other mesh parameters.");\r
- m.delete();\r
- }\r
- mesh.delete();\r
- if (pt==null)\r
- {\r
- System.out.println("Triangulation failed for face "+face+". Mesh not generated.");\r
- continue;\r
- }\r
- GP_Trsf trsf = loc.transformation();\r
- double[] mat = new double[16];\r
- trsf.getValues(mat);\r
- Matrix4d m = new Matrix4d(mat);\r
- \r
- double[] dnodes = pt.nodes();\r
- final int[] itriangles = pt.triangles(); \r
-\r
- if(face.orientation()==TopAbs_Orientation.REVERSED)\r
- {\r
- flipFace(itriangles);\r
- }\r
- \r
- final float[] fnodes=createFloatVertices(dnodes, m);\r
- IndexedGeometry geom = new IndexedGeometry();\r
- geom.setCoordinates(fnodes);\r
- geom.setIndices(itriangles);\r
- geom.setNormals(calcNormals(fnodes,itriangles));\r
- faceMeshes.add(geom);\r
- }\r
- }\r
- */\r
- \r
- private float[] createFloatVertices(double dnodes[], Matrix4d m) {\r
- float[] fnodes=new float[dnodes.length];\r
- Point3d p = new Point3d();\r
- \r
- for(int i=0; i<dnodes.length;)\r
- {\r
- p.x = dnodes[i];\r
- p.y = dnodes[i+1];\r
- p.z = dnodes[i+2];\r
- m.transform(p);\r
- fnodes[i++]=(float) p.x;\r
- fnodes[i++]=(float) p.y;\r
- fnodes[i++]=(float) p.z; \r
- }\r
- return fnodes;\r
- }\r
- private double deflection(TopoDS_Shape s) {\r
- Bnd_Box box = new Bnd_Box(); \r
- BRepBndLib.add(s,box);\r
- \r
- double[] bbox = box.get();\r
- double boundingBoxDeflection=0.01*\r
- Math.max(Math.max(bbox[3]-bbox[0], bbox[4]-bbox[1]), bbox[5]-bbox[2]);\r
- box.delete();\r
- return boundingBoxDeflection;\r
- }\r
- \r
- private double edgeDeflection(TopoDS_Shape s) {\r
- return 0.5 * deflection(s);\r
- }\r
- \r
- /**\r
- * org.jcae.viewer3d.cad.occ.OCCEdgeDomain\r
- * @param shape\r
- * @param geom\r
- */\r
- private void buildEdges(TopoDS_Shape shape) {\r
- \r
- \r
- TopExp_Explorer explorer = new TopExp_Explorer();\r
- HashSet<TopoDS_Edge> alreadyDone=new HashSet<TopoDS_Edge>();\r
- double boundingBoxDeflection = edgeDeflection(shape);\r
-\r
- for (explorer.init(shape, TopAbs_ShapeEnum.EDGE); explorer.more(); explorer.next())\r
- {\r
- TopoDS_Shape s = explorer.current(); \r
- if (!(s instanceof TopoDS_Edge)) continue; // should not happen!\r
- TopoDS_Edge e = (TopoDS_Edge)s;\r
- \r
- if(!alreadyDone.add(e))\r
- continue;\r
- \r
- double[] range = BRep_Tool.range(e);\r
- Geom_Curve gc = BRep_Tool.curve(e, range);\r
- float[] array;\r
- if(gc!=null)\r
- {\r
- GeomAdaptor_Curve adaptator = new GeomAdaptor_Curve(gc);\r
- GCPnts_UniformDeflection deflector = new GCPnts_UniformDeflection();\r
-\r
- deflector.initialize(adaptator, boundingBoxDeflection, range[0], range[1]);\r
- int npts = deflector.nbPoints();\r
- \r
- // Allocate one additional point at each end = parametric value 0, 1\r
- int size = 0;\r
- if (npts > 2)\r
- size = (npts-2)*2;\r
- size+=2;\r
- size*=3;\r
- array = new float[size]; \r
- int j=0;\r
- double[] values = adaptator.value(range[0]);\r
- array[j++] = (float) values[0];\r
- array[j++] = (float) values[1];\r
- array[j++] = (float) values[2];\r
- // All intermediary points\r
- for (int i=1; i<npts-1; ++i) {\r
- values = adaptator.value(deflector.parameter(i+1));\r
- array[j++] = (float) values[0];\r
- array[j++] = (float) values[1];\r
- array[j++] = (float) values[2];\r
- array[j++] = (float) values[0];\r
- array[j++] = (float) values[1];\r
- array[j++] = (float) values[2];\r
- }\r
- // Add last point\r
- values = adaptator.value(range[1]);\r
- array[j++] = (float) values[0];\r
- array[j++] = (float) values[1];\r
- array[j++] = (float) values[2];\r
- edges.add(array);\r
- adaptator.delete();\r
- deflector.delete();\r
- }\r
- else\r
- {\r
- if (!BRep_Tool.degenerated(e))\r
- {\r
- // So, there is no curve, and the edge is not degenerated?\r
- // => draw lines between the vertices and ignore curvature \r
- // best approximation we can do\r
- ArrayList<double[]> aa = new ArrayList<double[]>(); // store points here\r
- for (TopExp_Explorer explorer2 = new TopExp_Explorer(s, TopAbs_ShapeEnum.VERTEX);\r
- explorer2.more(); explorer2.next())\r
- {\r
- TopoDS_Shape sv = explorer2.current();\r
- if (!(sv instanceof TopoDS_Vertex)) continue; // should not happen!\r
- TopoDS_Vertex v = (TopoDS_Vertex)sv;\r
- aa.add(BRep_Tool.pnt(v));\r
- }\r
- int size = 0;\r
- if (aa.size() > 2)\r
- size = (aa.size()-2)*2;\r
- size+=2;\r
- double[] f=(double[])aa.get(0);\r
- array = new float[size*3];\r
- array[0]=(float) f[0];\r
- array[1]=(float) f[1];\r
- array[2]=(float) f[2];\r
- for(int i=1, j=3; i<aa.size()-1; i++)\r
- {\r
- f=aa.get(i);\r
- array[j++]=(float) f[0];\r
- array[j++]=(float) f[1];\r
- array[j++]=(float) f[2];\r
- array[j++]=(float) f[0];\r
- array[j++]=(float) f[1];\r
- array[j++]=(float) f[2];\r
- }\r
- f=aa.get(aa.size()-1);\r
- array[array.length-3]=(float) f[0];\r
- array[array.length-2]=(float) f[1];\r
- array[array.length-1]=(float) f[2];\r
- edges.add(array);\r
- }\r
- }\r
- } \r
- }\r
- \r
- private float[] calcNormals(float[] fnodes, int[] trias) {\r
- float nnodes[] = new float[fnodes.length];\r
- for (int i = 0; i < nnodes.length; i++) nnodes[i] = 0.f;\r
- Vector3f v1 = new Vector3f();\r
- Vector3f v2 = new Vector3f();\r
- Vector3f v3 = new Vector3f();\r
- Vector3f t1 = new Vector3f();\r
- Vector3f t2 = new Vector3f();\r
- Vector3f n = new Vector3f();\r
- for (int i = 0; i < trias.length; i+=3) {\r
- v1.x = fnodes[trias[i]*3];\r
- v1.y = fnodes[trias[i]*3+1];\r
- v1.z = fnodes[trias[i]*3+2];\r
- v2.x = fnodes[trias[i+1]*3];\r
- v2.y = fnodes[trias[i+1]*3+1];\r
- v2.z = fnodes[trias[i+1]*3+2];\r
- v3.x = fnodes[trias[i+2]*3];\r
- v3.y = fnodes[trias[i+2]*3+1];\r
- v3.z = fnodes[trias[i+2]*3+2];\r
- t1.sub(v3, v1);\r
- t2.sub(v2, v1);\r
- n.cross(t2, t1);\r
- //n.normalize();\r
- nnodes[trias[i]*3] += n.x;\r
- nnodes[trias[i]*3+1] += n.y;\r
- nnodes[trias[i]*3+2] += n.z;\r
- nnodes[trias[i+1]*3] += n.x;\r
- nnodes[trias[i+1]*3+1] += n.y;\r
- nnodes[trias[i+1]*3+2] += n.z;\r
- nnodes[trias[i+2]*3] += n.x;\r
- nnodes[trias[i+2]*3+1] += n.y;\r
- nnodes[trias[i+2]*3+2] += n.z;\r
- }\r
- for (int i = 0; i < nnodes.length; i+=3) {\r
- n.x = nnodes[i];\r
- n.y = nnodes[i+1];\r
- n.z = nnodes[i+2];\r
- n.normalize();\r
- nnodes[i] = n.x;\r
- nnodes[i+1] = n.y;\r
- nnodes[i+2] = n.z;\r
- }\r
- return nnodes;\r
- }\r
- \r
- private void flipFace(int[] trias) {\r
- int newTrias[] = new int[trias.length];\r
- System.arraycopy(trias, 0, newTrias, 0, trias.length);\r
- for (int i = 0; i < trias.length; i++) {\r
- trias[i] = newTrias[trias.length - i - 1];\r
- }\r
- } \r
- \r
-}\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<classpath>\r
- <classpathentry kind="src" path="src"/>\r
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>\r
- <classpathentry kind="output" path="bin"/>\r
-</classpath>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<projectDescription>\r
- <name>org.simantics.g3d.shapeeditor</name>\r
- <comment></comment>\r
- <projects>\r
- </projects>\r
- <buildSpec>\r
- <buildCommand>\r
- <name>org.eclipse.jdt.core.javabuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- <buildCommand>\r
- <name>org.eclipse.pde.ManifestBuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- <buildCommand>\r
- <name>org.eclipse.pde.SchemaBuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- </buildSpec>\r
- <natures>\r
- <nature>org.eclipse.pde.PluginNature</nature>\r
- <nature>org.eclipse.jdt.core.javanature</nature>\r
- </natures>\r
-</projectDescription>\r
+++ /dev/null
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Shapeeditor Plug-in
-Bundle-SymbolicName: org.simantics.g3d.shapeeditor;singleton:=true
-Bundle-Version: 0.0.1.qualifier
-Bundle-Activator: org.simantics.proconf.g3d.shapeeditor.Activator
-Bundle-Vendor: VTT Technical Research Center of Finland
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.ui.views.properties.tabbed,
- com.jme.eclipse,
- javax.vecmath,
- org.jcae.opencascade.jni,
- org.simantics.image.stubs,
- org.simantics.db.layer0;bundle-version="1.1.0",
- org.simantics.layer0.utils,
- org.simantics.utils,
- org.simantics.ui;bundle-version="1.0.0",
- org.simantics.animation,
- org.simantics.proconf.ode,
- org.simantics.utils.ui,
- org.simantics.equation,
- org.simantics.db,
- org.simantics.utils.ui.workbench,
- org.simantics.proconf.browsing,
- org.simantics.db.services,
- org.simantics.g3d;bundle-version="0.0.1",
- org.simantics.g3d.csg;bundle-version="0.0.1",
- org.simantics.g3d.occ;bundle-version="0.0.1"
-Eclipse-LazyStart: true
-Export-Package: org.simantics.proconf.g3d.shapeeditor.views
+++ /dev/null
-source.. = src/\r
-output.. = bin/\r
-bin.includes = META-INF/,\\r
- .,\\r
- plugin.xml\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<!-- Created with Inkscape (http://www.inkscape.org/) -->\r
-<svg\r
- xmlns:dc="http://purl.org/dc/elements/1.1/"\r
- xmlns:cc="http://web.resource.org/cc/"\r
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"\r
- xmlns:svg="http://www.w3.org/2000/svg"\r
- xmlns="http://www.w3.org/2000/svg"\r
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"\r
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"\r
- width="744.09448819"\r
- height="1052.3622047"\r
- id="svg2"\r
- sodipodi:version="0.32"\r
- inkscape:version="0.44"\r
- sodipodi:docbase="D:\työt"\r
- sodipodi:docname="difference.svg"\r
- inkscape:export-filename="D:\työt\difference.png"\r
- inkscape:export-xdpi="4.612184"\r
- inkscape:export-ydpi="4.612184">\r
- <defs\r
- id="defs4" />\r
- <sodipodi:namedview\r
- id="base"\r
- pagecolor="#ffffff"\r
- bordercolor="#666666"\r
- borderopacity="1.0"\r
- gridtolerance="10000"\r
- guidetolerance="10"\r
- objecttolerance="10"\r
- inkscape:pageopacity="0.0"\r
- inkscape:pageshadow="2"\r
- inkscape:zoom="2.5664702"\r
- inkscape:cx="171.53487"\r
- inkscape:cy="890.09888"\r
- inkscape:document-units="px"\r
- inkscape:current-layer="layer1"\r
- showgrid="true"\r
- inkscape:window-width="1280"\r
- inkscape:window-height="968"\r
- inkscape:window-x="-4"\r
- inkscape:window-y="-4" />\r
- <metadata\r
- id="metadata7">\r
- <rdf:RDF>\r
- <cc:Work\r
- rdf:about="">\r
- <dc:format>image/svg+xml</dc:format>\r
- <dc:type\r
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />\r
- </cc:Work>\r
- </rdf:RDF>\r
- </metadata>\r
- <g\r
- inkscape:label="Layer 1"\r
- inkscape:groupmode="layer"\r
- id="layer1">\r
- <rect\r
- style="fill:none;fill-opacity:1;stroke:navy;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"\r
- id="rect1876"\r
- width="303.06973"\r
- height="299.80225"\r
- x="20"\r
- y="12.362183" />\r
- <path\r
- style="fill:lime;fill-opacity:1;stroke:none;stroke-width:27.12068065;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:27.12068065,54.2413613;stroke-dashoffset:0;stroke-opacity:1"\r
- d="M 130.1875 26 C 73.425961 26 27.343749 73.576037 27.34375 132.21875 C 27.34375 187.17447 67.823401 232.43322 119.625 237.90625 L 119.625 110.625 L 230.875 110.625 C 221.21132 62.322879 179.78947 26 130.1875 26 z "\r
- id="path14325" />\r
- <path\r
- sodipodi:type="arc"\r
- style="fill:none;fill-opacity:1;stroke:blue;stroke-width:27.12068065;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:27.12068065,54.2413613;stroke-dashoffset:0;stroke-opacity:1"\r
- id="path9884"\r
- sodipodi:cx="113.82415"\r
- sodipodi:cy="116.55048"\r
- sodipodi:rx="86.560883"\r
- sodipodi:ry="90.650368"\r
- d="M 200.38503 116.55048 A 86.560883 90.650368 0 1 1 27.263268,116.55048 A 86.560883 90.650368 0 1 1 200.38503 116.55048 z"\r
- transform="matrix(1.187937,0,0,1.17194,-5.033825,-4.36331)" />\r
- <rect\r
- style="fill:none;fill-opacity:1;stroke:red;stroke-width:32;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:32,64;stroke-dashoffset:0;stroke-opacity:1"\r
- id="rect1880"\r
- width="181.57614"\r
- height="182.39815"\r
- x="119.61777"\r
- y="110.61679" />\r
- </g>\r
-</svg>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<!-- Created with Inkscape (http://www.inkscape.org/) -->\r
-<svg\r
- xmlns:dc="http://purl.org/dc/elements/1.1/"\r
- xmlns:cc="http://web.resource.org/cc/"\r
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"\r
- xmlns:svg="http://www.w3.org/2000/svg"\r
- xmlns="http://www.w3.org/2000/svg"\r
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"\r
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"\r
- width="744.09448819"\r
- height="1052.3622047"\r
- id="svg2"\r
- sodipodi:version="0.32"\r
- inkscape:version="0.44"\r
- sodipodi:docbase="D:\työt"\r
- sodipodi:docname="intersection.svg"\r
- inkscape:export-filename="D:\työt\union.png"\r
- inkscape:export-xdpi="4.7871981"\r
- inkscape:export-ydpi="4.7871981">\r
- <defs\r
- id="defs4" />\r
- <sodipodi:namedview\r
- id="base"\r
- pagecolor="#ffffff"\r
- bordercolor="#666666"\r
- borderopacity="1.0"\r
- gridtolerance="10000"\r
- guidetolerance="10"\r
- objecttolerance="10"\r
- inkscape:pageopacity="0.0"\r
- inkscape:pageshadow="2"\r
- inkscape:zoom="2.5664702"\r
- inkscape:cx="171.53487"\r
- inkscape:cy="890.09888"\r
- inkscape:document-units="px"\r
- inkscape:current-layer="layer1"\r
- showgrid="true"\r
- inkscape:window-width="1280"\r
- inkscape:window-height="968"\r
- inkscape:window-x="-4"\r
- inkscape:window-y="-4" />\r
- <metadata\r
- id="metadata7">\r
- <rdf:RDF>\r
- <cc:Work\r
- rdf:about="">\r
- <dc:format>image/svg+xml</dc:format>\r
- <dc:type\r
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />\r
- </cc:Work>\r
- </rdf:RDF>\r
- </metadata>\r
- <g\r
- inkscape:label="Layer 1"\r
- inkscape:groupmode="layer"\r
- id="layer1">\r
- <rect\r
- style="fill:none;fill-opacity:1;stroke:navy;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"\r
- id="rect1876"\r
- width="303.06973"\r
- height="299.80225"\r
- x="20"\r
- y="12.362183" />\r
- <path\r
- style="fill:lime;fill-opacity:1;stroke:none;stroke-width:32;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:32,64;stroke-dashoffset:0;stroke-opacity:1"\r
- d="M 119.625 110.625 L 119.625 237.90625 C 123.10038 238.27344 126.61878 238.46875 130.1875 238.46875 C 186.94904 238.46875 233 190.86146 233 132.21875 C 233 124.82191 232.26986 117.59694 230.875 110.625 L 119.625 110.625 z "\r
- id="rect13432" />\r
- <path\r
- sodipodi:type="arc"\r
- style="fill:none;fill-opacity:1;stroke:blue;stroke-width:27.12068065;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:27.12068065,54.2413613;stroke-dashoffset:0;stroke-opacity:1"\r
- id="path9884"\r
- sodipodi:cx="113.82415"\r
- sodipodi:cy="116.55048"\r
- sodipodi:rx="86.560883"\r
- sodipodi:ry="90.650368"\r
- d="M 200.38503 116.55048 A 86.560883 90.650368 0 1 1 27.263268,116.55048 A 86.560883 90.650368 0 1 1 200.38503 116.55048 z"\r
- transform="matrix(1.187937,0,0,1.17194,-5.033825,-4.36331)" />\r
- <rect\r
- style="fill:none;fill-opacity:1;stroke:red;stroke-width:32;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:32,64;stroke-dashoffset:0;stroke-opacity:1"\r
- id="rect1880"\r
- width="181.57614"\r
- height="182.39815"\r
- x="119.61777"\r
- y="110.61679" />\r
- </g>\r
-</svg>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="100"
- height="100"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- version="1.0"
- sodipodi:docname="link.svg"
- sodipodi:docbase="D:\dev\icons"
- inkscape:export-filename="D:\dev\icons\link.png"
- inkscape:export-xdpi="14.4"
- inkscape:export-ydpi="14.4">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient4583">
- <stop
- style="stop-color:#0049ff;stop-opacity:1;"
- offset="0"
- id="stop4585" />
- <stop
- style="stop-color:#00b3b3;stop-opacity:1;"
- offset="1"
- id="stop4587" />
- </linearGradient>
- <linearGradient
- id="linearGradient3686">
- <stop
- style="stop-color:red;stop-opacity:0;"
- offset="0"
- id="stop3688" />
- <stop
- style="stop-color:red;stop-opacity:1;"
- offset="1"
- id="stop3690" />
- </linearGradient>
- <linearGradient
- id="linearGradient3133">
- <stop
- style="stop-color:#4c4c4c;stop-opacity:1;"
- offset="0"
- id="stop3135" />
- <stop
- id="stop3141"
- offset="0.5"
- style="stop-color:#cbcbcb;stop-opacity:1;" />
- <stop
- style="stop-color:#4c4c4c;stop-opacity:1;"
- offset="1"
- id="stop3137" />
- </linearGradient>
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="7.72"
- inkscape:cx="50"
- inkscape:cy="55.181347"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- width="100px"
- height="100px"
- inkscape:window-width="1280"
- inkscape:window-height="968"
- inkscape:window-x="-4"
- inkscape:window-y="-4" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <path
- sodipodi:type="arc"
- style="fill:none;fill-opacity:1;stroke:#fd2306;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path3660"
- sodipodi:cx="45.142487"
- sodipodi:cy="45.272022"
- sodipodi:rx="7.7072539"
- sodipodi:ry="7.9663215"
- d="M 52.849741 45.272022 A 7.7072539 7.9663215 0 1 1 37.435233,45.272022 A 7.7072539 7.9663215 0 1 1 52.849741 45.272022 z"
- transform="translate(-3.238342,-1.813472)" />
- <path
- sodipodi:type="arc"
- style="fill:none;fill-opacity:1;stroke:#fd2306;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path4547"
- sodipodi:cx="45.142487"
- sodipodi:cy="45.272022"
- sodipodi:rx="7.7072539"
- sodipodi:ry="7.9663215"
- d="M 52.849741 45.272022 A 7.7072539 7.9663215 0 1 1 37.435233,45.272022 A 7.7072539 7.9663215 0 1 1 52.849741 45.272022 z"
- transform="translate(4.468912,7.189118)" />
- <path
- sodipodi:type="arc"
- style="fill:none;fill-opacity:1;stroke:#fd2306;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path4549"
- sodipodi:cx="45.142487"
- sodipodi:cy="45.272022"
- sodipodi:rx="7.7072539"
- sodipodi:ry="7.9663215"
- d="M 52.849741 45.272022 A 7.7072539 7.9663215 0 1 1 37.435233,45.272022 A 7.7072539 7.9663215 0 1 1 52.849741 45.272022 z"
- transform="translate(12.37046,15.60881)" />
- <rect
- style="fill:#009bff;fill-opacity:1;stroke:#009aff;stroke-width:1.72972977;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect1886"
- width="30.270269"
- height="30.270269"
- x="9.8648653"
- y="9.8648653" />
- <path
- sodipodi:type="arc"
- style="fill:#2fc82f;fill-opacity:1;stroke:#2fc82f;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path1884"
- sodipodi:cx="72.5"
- sodipodi:cy="72.5"
- sodipodi:rx="17.5"
- sodipodi:ry="17.5"
- d="M 90 72.5 A 17.5 17.5 0 1 1 55,72.5 A 17.5 17.5 0 1 1 90 72.5 z" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<!-- Created with Inkscape (http://www.inkscape.org/) -->\r
-<svg\r
- xmlns:dc="http://purl.org/dc/elements/1.1/"\r
- xmlns:cc="http://web.resource.org/cc/"\r
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"\r
- xmlns:svg="http://www.w3.org/2000/svg"\r
- xmlns="http://www.w3.org/2000/svg"\r
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"\r
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"\r
- width="744.09448819"\r
- height="1052.3622047"\r
- id="svg2"\r
- sodipodi:version="0.32"\r
- inkscape:version="0.44"\r
- sodipodi:docbase="D:\työt"\r
- sodipodi:docname="union.svg"\r
- inkscape:export-filename="D:\työt\union.png"\r
- inkscape:export-xdpi="4.612184"\r
- inkscape:export-ydpi="4.612184">\r
- <defs\r
- id="defs4" />\r
- <sodipodi:namedview\r
- id="base"\r
- pagecolor="#ffffff"\r
- bordercolor="#666666"\r
- borderopacity="1.0"\r
- gridtolerance="10000"\r
- guidetolerance="10"\r
- objecttolerance="10"\r
- inkscape:pageopacity="0.0"\r
- inkscape:pageshadow="2"\r
- inkscape:zoom="2.5664702"\r
- inkscape:cx="171.53487"\r
- inkscape:cy="890.09888"\r
- inkscape:document-units="px"\r
- inkscape:current-layer="layer1"\r
- showgrid="true"\r
- inkscape:window-width="1280"\r
- inkscape:window-height="968"\r
- inkscape:window-x="-4"\r
- inkscape:window-y="-4" />\r
- <metadata\r
- id="metadata7">\r
- <rdf:RDF>\r
- <cc:Work\r
- rdf:about="">\r
- <dc:format>image/svg+xml</dc:format>\r
- <dc:type\r
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />\r
- </cc:Work>\r
- </rdf:RDF>\r
- </metadata>\r
- <g\r
- inkscape:label="Layer 1"\r
- inkscape:groupmode="layer"\r
- id="layer1">\r
- <rect\r
- style="fill:none;fill-opacity:1;stroke:navy;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"\r
- id="rect1876"\r
- width="303.06973"\r
- height="299.80225"\r
- x="20"\r
- y="12.362183" />\r
- <path\r
- style="fill:lime;fill-opacity:1;stroke:blue;stroke-width:3.39008508;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"\r
- d="M 130.1875 26 C 73.425961 26 27.343749 73.576037 27.34375 132.21875 C 27.34375 187.17447 67.823401 232.43322 119.625 237.90625 L 119.625 293 L 301.1875 293 L 301.1875 110.625 L 230.875 110.625 C 221.21132 62.322879 179.78947 26 130.1875 26 z "\r
- id="path1878" />\r
- <path\r
- sodipodi:type="arc"\r
- style="fill:none;fill-opacity:1;stroke:blue;stroke-width:27.12068065;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:27.12068065,54.2413613;stroke-dashoffset:0;stroke-opacity:1"\r
- id="path9884"\r
- sodipodi:cx="113.82415"\r
- sodipodi:cy="116.55048"\r
- sodipodi:rx="86.560883"\r
- sodipodi:ry="90.650368"\r
- d="M 200.38503 116.55048 A 86.560883 90.650368 0 1 1 27.263268,116.55048 A 86.560883 90.650368 0 1 1 200.38503 116.55048 z"\r
- transform="matrix(1.187937,0,0,1.17194,-5.033825,-4.36331)" />\r
- <rect\r
- style="fill:none;fill-opacity:1;stroke:red;stroke-width:32;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:32,64;stroke-dashoffset:0;stroke-opacity:1"\r
- id="rect1880"\r
- width="181.57614"\r
- height="182.39815"\r
- x="119.61777"\r
- y="110.61679" />\r
- </g>\r
-</svg>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="100"
- height="100"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- version="1.0"
- sodipodi:docname="unlink.svg"
- sodipodi:docbase="D:\dev\icons"
- inkscape:export-filename="D:\dev\icons\unlink.png"
- inkscape:export-xdpi="14.4"
- inkscape:export-ydpi="14.4">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient4583">
- <stop
- style="stop-color:#0049ff;stop-opacity:1;"
- offset="0"
- id="stop4585" />
- <stop
- style="stop-color:#00b3b3;stop-opacity:1;"
- offset="1"
- id="stop4587" />
- </linearGradient>
- <linearGradient
- id="linearGradient3686">
- <stop
- style="stop-color:red;stop-opacity:0;"
- offset="0"
- id="stop3688" />
- <stop
- style="stop-color:red;stop-opacity:1;"
- offset="1"
- id="stop3690" />
- </linearGradient>
- <linearGradient
- id="linearGradient3133">
- <stop
- style="stop-color:#4c4c4c;stop-opacity:1;"
- offset="0"
- id="stop3135" />
- <stop
- id="stop3141"
- offset="0.5"
- style="stop-color:#cbcbcb;stop-opacity:1;" />
- <stop
- style="stop-color:#4c4c4c;stop-opacity:1;"
- offset="1"
- id="stop3137" />
- </linearGradient>
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="7.72"
- inkscape:cx="50"
- inkscape:cy="55.181347"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- width="100px"
- height="100px"
- inkscape:window-width="1280"
- inkscape:window-height="968"
- inkscape:window-x="-4"
- inkscape:window-y="-4" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <path
- sodipodi:type="arc"
- style="fill:none;fill-opacity:1;stroke:#fd2306;stroke-width:4.10961773;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:4.10961773,4.10961773;stroke-dashoffset:4.10961773;stroke-opacity:1"
- id="path4549"
- sodipodi:cx="45.142487"
- sodipodi:cy="45.272022"
- sodipodi:rx="7.7072539"
- sodipodi:ry="7.9663215"
- d="M 52.849741 45.272022 A 7.7072539 7.9663215 0 1 1 37.435233,45.272022 A 7.7072539 7.9663215 0 1 1 52.849741 45.272022 z"
- transform="matrix(2.507716,0,0,2.361124,-67.73823,-58.31771)" />
- <rect
- style="fill:#0052ff;fill-opacity:1;stroke:#0052ff;stroke-width:1.93978441;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect1886"
- width="33.946224"
- height="33.946224"
- x="9.9698925"
- y="9.9698925" />
- <path
- sodipodi:type="arc"
- style="fill:#2faa2f;fill-opacity:1;stroke:#2fab2f;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path1884"
- sodipodi:cx="72.5"
- sodipodi:cy="72.5"
- sodipodi:rx="17.5"
- sodipodi:ry="17.5"
- d="M 90 72.5 A 17.5 17.5 0 1 1 55,72.5 A 17.5 17.5 0 1 1 90 72.5 z"
- transform="matrix(1.133035,0,0,1.133035,-12.10615,-12.10615)" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<?eclipse version="3.2"?>\r
-<plugin>\r
- <extension\r
- point="org.eclipse.ui.commands">\r
- <command\r
- categoryId="org.simantics.proconf.shapeeditor.commands"\r
- description="New CSG-Model"\r
- id="org.simantics.proconf.shapeeditor.commands.newCSG"\r
- name="New CSG-Model">\r
- </command>\r
- </extension>\r
- <extension\r
- point="org.eclipse.ui.handlers">\r
- <handler\r
- class="org.simantics.proconf.g3d.shapeeditor.handlers.NewCSGModelHandler"\r
- commandId="org.simantics.proconf.shapeeditor.commands.newCSG">\r
- </handler>\r
- </extension>\r
- <extension\r
- point="org.eclipse.ui.menus">\r
- <menuContribution\r
- locationURI="popup:#OEPopup?after=additions">\r
- <command\r
- commandId="org.simantics.proconf.shapeeditor.commands.newCSG"\r
- icon="icons/union.png"\r
- id="org.simantics.proconf.shapeeditor.popups.newCSG"\r
- label="New CSG-Model"\r
- style="push">\r
- <visibleWhen>\r
- <and>\r
- <with\r
- variable="activeContexts">\r
- <iterate\r
- ifEmpty="false"\r
- operator="or">\r
- <equals\r
- value="org.simantics.proconf.shapeeditor.csg">\r
- </equals>\r
- </iterate>\r
- </with>\r
- <with\r
- variable="selection">\r
- <and>\r
- <test\r
- args="http://www.vtt.fi/Simantics/Layer0/1.0/Types#Library"\r
- property="org.simantics.graph.resourceType">\r
- </test>\r
- </and>\r
- </with>\r
- </and>\r
- </visibleWhen>\r
- </command>\r
- </menuContribution>\r
- </extension>\r
- <extension\r
- point="org.simantics.ui.resourceEditorAdapter">\r
- <adapterClass\r
- class="org.simantics.proconf.g3d.shapeeditor.handlers.ResourceEditorAdapter1"\r
- id="org.simantics.proconf.shapeeditor.ResourceEditorDescription1">\r
- </adapterClass>\r
- <adapterClass\r
- class="org.simantics.proconf.g3d.shapeeditor.handlers.ResourceEditorAdapter3"\r
- id="org.simantics.proconf.shapeeditor.ResourceEditorDescription3">\r
- </adapterClass>\r
- </extension>\r
- <extension\r
- point="org.eclipse.ui.editors">\r
- <editor\r
- class="org.simantics.proconf.g3d.shapeeditor.views.ShapeEditorView"\r
- icon="icons/union.png"\r
- id="org.simantics.proconf.shapeeditor.editor1"\r
- name="ShapeEditor">\r
- </editor>\r
- <editor\r
- class="org.simantics.proconf.g3d.shapeeditor.views.ParameterizationEditor"\r
- icon="icons/unlink.png"\r
- id="org.simantics.proconf.shapeeditor.editor3"\r
- name="ParameterizationEditor">\r
- </editor>\r
- </extension>\r
- <extension\r
- point="org.eclipse.ui.views">\r
- <view\r
- class="org.simantics.proconf.g3d.shapeeditor.views.StructureView"\r
- icon="icons/union.png"\r
- id="org.simantics.shapeeditor.views.structure"\r
- name="Structure View">\r
- </view>\r
- <view\r
- class="org.simantics.proconf.g3d.shapeeditor.views.CSGModellingView"\r
- icon="icons/union.png"\r
- id="org.simantics.proconf.shapeeditor.views.modelling"\r
- name="CSG Modelling View">\r
- </view>\r
- </extension>\r
- <extension\r
- point="org.simantics.db.resourceAdapter">\r
- <resource_adapter\r
- adapter_class="org.simantics.proconf.g3d.shapeeditor.handlers.CSGProjectAdapter"\r
- operation="http://www.vtt.fi/Simantics/Layer0/1.0/Relations#HasProjectTypeAdapter"\r
- type_uri="http://www.vtt.fi/Simantics/CSG/1.0/Types#CSGProjectType">\r
- </resource_adapter>\r
- </extension>\r
- <extension\r
- point="org.eclipse.ui.perspectives">\r
- <perspective\r
- class="org.simantics.proconf.g3d.shapeeditor.perspectives.CSGModellingPerspective"\r
- icon="icons/union.png"\r
- id="org.simantics.proconf.shapeeditor.perspectives.csg"\r
- name="CSG Modelling">\r
- </perspective>\r
- </extension>\r
- <extension\r
- point="org.eclipse.ui.perspectiveExtensions">\r
- <perspectiveExtension\r
- targetID="org.simantics.proconf.shapeeditor.perspectives.csg">\r
- <view\r
- id="org.simantics.proconf.shapeeditor.views.modelling"\r
- ratio="0.3"\r
- relationship="left"\r
- relative="org.eclipse.ui.editorss"\r
- visible="true">\r
- </view>\r
- <view\r
- id="org.simantics.proconf.browsing.views.property"\r
- ratio="0.7"\r
- relationship="bottom"\r
- relative="org.simantics.proconf.shapeeditor.views.modelling"\r
- visible="true">\r
- </view>\r
- <view\r
- id="org.eclipse.pde.runtime.LogView"\r
- relationship="fast"\r
- relative="fi.vtt.proconf.ui.views.property"\r
- visible="false">\r
- </view>\r
- <view\r
- id="org.simantics.shapeeditor.views.structure"\r
- relationship="stack"\r
- relative="org.simantics.proconf.shapeeditor.views.modelling">\r
- </view>\r
- <view\r
- id="org.simantics.g3d.views.scenegraph"\r
- ratio="0.3"\r
- relationship="right"\r
- relative="org.eclipse.ui.editorss"\r
- visible="true">\r
- </view>\r
- </perspectiveExtension>\r
- </extension>\r
- <extension\r
- point="org.eclipse.ui.contexts">\r
- <context\r
- id="org.simantics.proconf.shapeeditor.csg"\r
- name="name">\r
- </context>\r
- </extension>\r
- <extension\r
- point="org.simantics.ui.perspectiveContextBinding">\r
- <binding\r
- contextIds="org.simantics.proconf.shapeeditor.csg"\r
- perspectiveId="org.simantics.proconf.shapeeditor.perspectives.csg">\r
- </binding>\r
- </extension>\r
-\r
-</plugin>\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor;\r
-\r
-import org.eclipse.ui.plugin.AbstractUIPlugin;\r
-import org.osgi.framework.BundleContext;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.management.ISessionContext;\r
-import org.simantics.db.management.ISessionContextChangedListener;\r
-import org.simantics.db.management.SessionContextChangedEvent;\r
-import org.simantics.proconf.ui.ProConfUI;\r
-\r
-/**\r
- * The activator class controls the plug-in life cycle\r
- */\r
-public class Activator extends AbstractUIPlugin {\r
-\r
- // The plug-in ID\r
- public static final String PLUGIN_ID = "org.simantics.proconf.g3d.shapeeditor";\r
-\r
- // The shared instance\r
- private static Activator plugin;\r
- \r
- /**\r
- * The constructor\r
- */\r
- public Activator() {\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)\r
- */\r
- public void start(BundleContext context) throws Exception {\r
- super.start(context);\r
- plugin = this;\r
- ProConfUI.getSessionContextProvider().addContextChangedListener(new ISessionContextChangedListener() {\r
- @Override\r
- public void sessionContextChanged(SessionContextChangedEvent event) {\r
- ISessionContext ctx = event.getNewValue();\r
- if (ctx != null) {\r
- ctx.getSession().asyncRead(new GraphRequestAdapter() {\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- ShapeEditorResources.initialize(g);\r
- return GraphRequestStatus.transactionComplete();\r
- };\r
- });\r
- } else {\r
- ShapeEditorResources.deinitialize();\r
- }\r
- }\r
- });\r
- try {\r
- ProConfUI.getSession().asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- ShapeEditorResources.initialize(g);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- } catch (Exception e) {\r
- \r
- }\r
- \r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)\r
- */\r
- public void stop(BundleContext context) throws Exception {\r
- plugin = null;\r
- super.stop(context);\r
- }\r
-\r
- /**\r
- * Returns the shared instance\r
- *\r
- * @return the shared instance\r
- */\r
- public static Activator getDefault() {\r
- return plugin;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor;\r
-\r
-import org.simantics.proconf.g3d.csg.stubs.CSGResource;\r
-import org.simantics.db.Builtins;\r
-import org.simantics.db.Graph;\r
-import org.simantics.equation.stubs.EquationResource;\r
-import org.simantics.animation.stubs.AnimationResource;\r
-import org.simantics.animation.curve.CurveBuilder;\r
-import org.simantics.animation.curve.CurveBuilderImpl;\r
-import org.simantics.proconf.g3d.stubs.G3DResource;\r
-\r
-public class ShapeEditorResources {\r
- public static Builtins builtins;\r
- public static G3DResource g3dResource;\r
- public static CSGResource csgResource;\r
- public static AnimationResource animationResource;\r
- public static CurveBuilder curveBuilder;\r
- public static EquationResource equationResource;\r
- \r
- public static void initialize(Graph g) {\r
- builtins = g.getBuiltins();\r
- animationResource = AnimationResource.getInstance(g);\r
- csgResource = CSGResource.getInstance(g);\r
- g3dResource = G3DResource.getInstance(g);\r
- curveBuilder = new CurveBuilderImpl(ShapeEditorResources.animationResource);\r
- equationResource = EquationResource.getInstance(g);\r
- }\r
- \r
- public static void deinitialize() {\r
- builtins = null;\r
- g3dResource = null;\r
- csgResource = null;\r
- animationResource = null;\r
- curveBuilder = null;\r
- equationResource = null;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.actions;\r
-\r
-import java.io.File;\r
-import java.io.FileOutputStream;\r
-import java.io.IOException;\r
-import java.util.Collection;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.widgets.FileDialog;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Statement;\r
-import org.simantics.layer0.utils.direct.GraphUtils;\r
-import org.simantics.layer0.utils.extent.Extent;\r
-import org.simantics.layer0.utils.extent.ExtentUtils;\r
-import org.simantics.layer0.utils.extent.IExtentAdvisor;\r
-import org.simantics.layer0.utils.serialization.ConnectionPointMap;\r
-import org.simantics.layer0.utils.serialization.TransferableGraph;\r
-import org.simantics.layer0.utils.serialization.TransferableGraphUtils;\r
-import org.simantics.proconf.g3d.shapeeditor.views.ShapeEditorBase;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-\r
-public class ExportAction extends Action{\r
- private ShapeEditorBase parent;\r
- \r
- public ExportAction(ShapeEditorBase parent) {\r
- this.parent = parent;\r
- this.setText("Export");\r
- this.setId("g3d shape export");\r
- }\r
- \r
- @Override\r
- public void run() {\r
- try {\r
- doExport();\r
- } catch (IOException e) {\r
- ErrorLogger.defaultLogError(e);\r
- }\r
- }\r
- \r
- private void doExport() throws IOException {\r
- FileDialog dialog = new FileDialog(parent.getRenderingComposite().getShell(),SWT.SAVE);\r
- String filename = dialog.open();\r
- if (filename == null)\r
- return;\r
- \r
- final File file = new File(filename);\r
- final FileOutputStream fos = new FileOutputStream(file);\r
- \r
- parent.getSession().asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- Resource modelResource = parent.getModelResource();\r
- System.out.println("Exporting " + modelResource);\r
- Collection<Statement> model = ExtentUtils.determineExtent(g, new ExtentAdvisor(), modelResource);\r
- \r
- for (Statement s : model) \r
- System.out.println(GraphUtils.getReadableName(g, s.getSubject())+", "+GraphUtils.getReadableName(g, s.getPredicate())+", "+GraphUtils.getReadableName(g, s.getObject())); \r
- \r
- ConnectionPointMap purposeProvider = new ConnectionPointMap();\r
- purposeProvider.put(modelResource, TransferableGraphUtils.CP_OBJECT);\r
- \r
- TransferableGraph dbIndependentSubgraph = TransferableGraphUtils.extractTransferableGraph(g, model, purposeProvider, null); \r
- \r
- byte[] data = TransferableGraphUtils.serialize(dbIndependentSubgraph);\r
- \r
- fos.write(data);\r
- \r
- System.out.println("Exporting done.");\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- @Override\r
- public void requestCompleted(GraphRequestStatus status) {\r
- try {\r
- fos.close();\r
- } catch (IOException e) {\r
- ErrorLogger.defaultLogError(e);\r
- }\r
- \r
- }\r
- });\r
- }\r
- \r
- public class ExtentAdvisor implements IExtentAdvisor {\r
- @Override\r
- public ExtentAdvice getAdvice(Graph g, Extent currentState, Resource extent) {\r
- System.out.println("Extent advice : " + currentState + " : " + extent);\r
- \r
- //if (extent.equals(ShapeEditorResources.equationResource.Expression)) return ExtentAdvice.Include;\r
- //return ExtentAdvice.Exclude;\r
- return ExtentAdvice.Include;\r
- }\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.actions;\r
-\r
-import java.io.BufferedInputStream;\r
-import java.io.File;\r
-import java.io.FileInputStream;\r
-import java.io.IOException;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.widgets.FileDialog;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Statement;\r
-import org.simantics.layer0.utils.serialization.ConnectionPointList;\r
-import org.simantics.layer0.utils.serialization.TransferableGraph;\r
-import org.simantics.layer0.utils.serialization.TransferableGraphUtils;\r
-import org.simantics.proconf.g3d.shapeeditor.views.ShapeEditorBase;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-public class ImportAction extends Action {\r
- \r
- private ShapeEditorBase parent;\r
- \r
- public ImportAction(ShapeEditorBase parent) {\r
- this.parent = parent;\r
- setText("Import");\r
- setId("g3d shape import");\r
- }\r
- \r
- @Override\r
- public void run() {\r
- try {\r
- doImport();\r
- } catch (IOException e) {\r
- ErrorLogger.defaultLogError(e);\r
- }\r
- }\r
- \r
- private void doImport() throws IOException {\r
- FileDialog dialog = new FileDialog(parent.getRenderingComposite().getShell(),SWT.OPEN);\r
- String filename = dialog.open();\r
- if (filename == null)\r
- return;\r
- File file = new File(filename);\r
- FileInputStream fis = new FileInputStream(file);\r
- BufferedInputStream bis = new BufferedInputStream(fis);\r
- byte[] data = new byte[0];\r
- byte[] buf = new byte[256];\r
- int res = 0;\r
- while ((res = bis.read(buf)) != -1) {\r
- byte[] newData = new byte[data.length + res];\r
- System.arraycopy(data, 0, newData, 0, data.length);\r
- System.arraycopy(buf, 0, newData, data.length, res);\r
- data = newData;\r
- }\r
- bis.close();\r
- final byte fdata[] = data;\r
- parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- TransferableGraph sg = TransferableGraphUtils.deserialize(fdata);\r
- ConnectionPointList purposes = TransferableGraphUtils.integrateTransferableGraph(g, sg, null);\r
- Resource modelResource = purposes.getSingleByDescription(TransferableGraphUtils.CP_OBJECT).resource;\r
- Resource currentModelResource = parent.getModelResource();\r
- for (Statement s : g.getStatements(modelResource)) {\r
- g.removeStatements(currentModelResource, s.getPredicate());\r
- }\r
- for (Statement s : g.getStatements(modelResource)) {\r
- \r
- g.removeStatement(s);\r
- g.addStatement(currentModelResource, s.getPredicate(), s.getObject());\r
- }\r
- \r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.actions;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.widgets.FileDialog;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.occ.geometry.OccTriangulator;\r
-\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.scene.Geometry;\r
-import com.jme.scene.state.MaterialState;\r
-\r
-\r
-public class LoadFileAction extends Action {\r
- private ThreeDimensionalEditorBase editor;\r
- \r
- public LoadFileAction(ThreeDimensionalEditorBase editor) {\r
- super("Load file");\r
- this.editor = editor;\r
- \r
- }\r
- \r
- public void run() {\r
- FileDialog loadDialog = new FileDialog(editor.getRenderingComposite().getShell(), SWT.OPEN);\r
- String exts[] = { "*.stp;*.step", "*.iges", "*.brep", "*.ply" }; //$NON-NLS-1$\r
- String names[] = { "STEP (AP214/AP203)", "IGES", "BREP", "PLY" }; //$NON-NLS-1$\r
- loadDialog.setFilterNames(names);\r
- loadDialog.setFilterExtensions(exts);\r
- loadDialog.setText("Load model");\r
-\r
- String filename = loadDialog.open();\r
- if (filename != null) {\r
- Geometry g = OccTriangulator.getGeometryFromFile(filename)[0];\r
- MaterialState ms = editor.getRenderingComponent().getDisplaySystem().getRenderer().createMaterialState();\r
- ms.setAmbient(new ColorRGBA(0.f,0.f,0.f,0.f));\r
- ms.setEmissive(new ColorRGBA(0.f,0.f,0.f,0.f));\r
- ms.setShininess(128.f);\r
- ms.setDiffuse(new ColorRGBA(0.8f,0.8f,0.8f,0.f));\r
- ms.setSpecular(new ColorRGBA(1.f,1.f,1.f,0.f));\r
- ms.setMaterialFace(MaterialState.MF_FRONT_AND_BACK);\r
- if (g.getColorBuffer(0) != null) {\r
- ms.setColorMaterial(MaterialState.CM_DIFFUSE);\r
- }\r
- g.setRenderState(ms);\r
- editor.getRenderingComponent().getShadowRoot().attachChild(g);\r
- // mo.setGeometry(mesh, filename);\r
- // xithComposite.getScene().compile();\r
- }\r
-\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.actions;\r
-\r
-import java.io.File;\r
-import java.io.FilenameFilter;\r
-import java.util.Stack;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.widgets.DirectoryDialog;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.occ.geometry.OccTriangulator;\r
-\r
-import com.jme.bounding.BoundingBox;\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.scene.Geometry;\r
-import com.jme.scene.state.MaterialState;\r
-\r
-\r
-public class LoadFolderAction extends Action {\r
- private ThreeDimensionalEditorBase editor;\r
- \r
- public LoadFolderAction(ThreeDimensionalEditorBase editor) {\r
- super("Load folder");\r
- this.editor = editor;\r
- \r
- }\r
- \r
- public void run() {\r
- \r
- DirectoryDialog loadDialog = new DirectoryDialog(editor.getRenderingComposite().getShell(), SWT.OPEN);\r
- loadDialog.setText("Select directory");\r
-\r
- String directory = loadDialog.open();\r
- if (directory != null) {\r
- File file = new File(directory);\r
- if (!file.isDirectory())\r
- return;\r
- Stack<File> directories = new Stack<File>();\r
- directories.push(file);\r
- boolean recursive = true;\r
- while (!directories.empty()) {\r
- File dir = directories.pop();\r
-\r
- String[] files = dir.list(new PLYFilter());\r
- for (String filename : files) {\r
- Geometry g = OccTriangulator.getGeometryFromFile(dir.getAbsolutePath() + "/" + filename)[0];\r
- MaterialState ms = editor.getRenderingComponent().getDisplaySystem().getRenderer().createMaterialState();\r
- ms.setAmbient(new ColorRGBA(0.f,0.f,0.f,0.f));\r
- ms.setEmissive(new ColorRGBA(0.f,0.f,0.f,0.f));\r
- ms.setShininess(128.f);\r
- ms.setDiffuse(new ColorRGBA(0.8f,0.8f,0.8f,0.f));\r
- ms.setSpecular(new ColorRGBA(1.f,1.f,1.f,0.f));\r
- ms.setMaterialFace(MaterialState.MF_FRONT_AND_BACK);\r
- if (g.getColorBuffer(0) != null) {\r
- ms.setColorMaterial(MaterialState.CM_DIFFUSE);\r
- }\r
- g.setModelBound(new BoundingBox());\r
- g.updateModelBound();\r
- g.setRenderState(ms);\r
- editor.getRenderingComponent().getShadowRoot().attachChild(g);\r
- g.updateWorldBound();\r
- g.lock();\r
- \r
- }\r
- if (recursive) {\r
- File[] newDirs = dir.listFiles(new DirectoryFilter());\r
- for (File d : newDirs)\r
- directories.push(d);\r
- }\r
- }\r
- \r
- }\r
-\r
-\r
- }\r
- \r
- protected class DirectoryFilter implements FilenameFilter {\r
- public boolean accept(File dir, String name) {\r
- File file = new File(dir.getAbsolutePath() + "/" + name);\r
- return file.isDirectory();\r
- }\r
- }\r
-\r
- protected class PLYFilter implements FilenameFilter {\r
- public boolean accept(File dir, String name) {\r
- return (name.endsWith("ply"));\r
- }\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.common;\r
-\r
-import java.util.Collection;\r
-\r
-import org.simantics.db.Builtins;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.Statement;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.viewpoints.AcceptDecision;\r
-import org.simantics.layer0.utils.viewpoints.AcceptRule;\r
-import org.simantics.layer0.utils.viewpoints.PlainStateFactory;\r
-import org.simantics.layer0.utils.viewpoints.ResourceViewpoint;\r
-import org.simantics.layer0.utils.viewpoints.State;\r
-import org.simantics.layer0.utils.viewpoints.StateFactory;\r
-import org.simantics.layer0.utils.viewpoints.TraversalDecision;\r
-import org.simantics.layer0.utils.viewpoints.TraversalRule;\r
-import org.simantics.layer0.utils.viewpoints.rules.AcceptAllResourceAcceptRule;\r
-import org.simantics.proconf.g3d.shapeeditor.ShapeEditorResources;\r
-\r
-\r
-public class ViewpointGenerator {\r
- \r
- public static ResourceViewpoint createStuctureViewpoint() {\r
- StateFactory f = new PlainStateFactory();\r
- final State rootState = f.newState();\r
- final State projectState = f.newState();\r
- final State libraryState = f.newState();\r
-\r
- return new ResourceViewpoint(new TraversalRule() {\r
- @Override\r
- public TraversalDecision makeTraversalDecision(State state,\r
- Statement statement) {\r
- Builtins b = statement.getGraph().getBuiltins();\r
- if (state.equals(rootState)) {\r
- if (!statement.getPredicate().equals(b.ConsistsOf))\r
- return TraversalDecision.stopTraversal;\r
- //if (!statement.getObject().isInstanceOf(b.Project))\r
- // return TraversalDecision.stopTraversal;\r
- return TraversalDecision.continueTraversal(projectState);\r
- } else if (state.equals(projectState)) {\r
- if (!statement.getPredicate().equals(b.ConsistsOf))\r
- return TraversalDecision.stopTraversal;\r
- //if (!statement.getObject().isInstanceOf(b.Library))\r
- // return TraversalDecision.stopTraversal;\r
- return TraversalDecision.continueTraversal(libraryState);\r
- } else if (state.equals(libraryState)) {\r
- if (!statement.getPredicate().equals(b.ConsistsOf)\r
- && !statement.getPredicate().isSubrelationOf(\r
- ShapeEditorResources.g3dResource.HasChild))\r
- return TraversalDecision.stopTraversal;\r
- return TraversalDecision.continueTraversal(libraryState);\r
- }\r
- return TraversalDecision.stopTraversal;\r
- }\r
-\r
- @Override\r
- public boolean areAllStatesRelevant() {\r
- return true;\r
- }\r
-\r
- @Override\r
- public Collection<State> relevantStates() {\r
- return null;\r
- }\r
- }, new AcceptAllResourceAcceptRule(), rootState);\r
- }\r
- \r
- public static ResourceViewpoint createObjectStructureViewpoint() {\r
- StateFactory f = new PlainStateFactory();\r
- final State rootState = f.newState();\r
-\r
- return new ResourceViewpoint(new TraversalRule() {\r
- @Override\r
- public TraversalDecision makeTraversalDecision(State state,\r
- Statement statement) {\r
- if (state.equals(rootState)) {\r
- if (!statement.getPredicate().isSubrelationOf(\r
- ShapeEditorResources.g3dResource.HasChild))\r
- return TraversalDecision.stopTraversal;\r
- return TraversalDecision.continueTraversal(rootState);\r
- }\r
- return TraversalDecision.stopTraversal;\r
- }\r
-\r
- @Override\r
- public boolean areAllStatesRelevant() {\r
- return true;\r
- }\r
-\r
- @Override\r
- public Collection<State> relevantStates() {\r
- return null;\r
- }\r
- }, new AcceptAllResourceAcceptRule(), rootState);\r
- }\r
- \r
- public static ResourceViewpoint createObjectSizingParameterViewpoint(Resource modelToParameterRelation) {\r
- StateFactory f = new PlainStateFactory();\r
- final State rootState = f.newState();\r
- final State endState = f.newState();\r
- final Resource relation = modelToParameterRelation;\r
-\r
- return new ResourceViewpoint(new TraversalRule() {\r
- @Override\r
- public TraversalDecision makeTraversalDecision(State state,\r
- Statement statement) {\r
- if (state.equals(rootState)) {\r
- if (!statement.getPredicate().isSubrelationOf(relation))\r
- return TraversalDecision.stopTraversal;\r
- return TraversalDecision.continueTraversal(endState);\r
- }\r
- return TraversalDecision.stopTraversal;\r
- }\r
-\r
- @Override\r
- public boolean areAllStatesRelevant() {\r
- return true;\r
- }\r
-\r
- @Override\r
- public Collection<State> relevantStates() {\r
- return null;\r
- }\r
- }, new AcceptAllResourceAcceptRule(), rootState);\r
- }\r
- \r
- public static ResourceViewpoint createViewpoint() {\r
- StateFactory f = new PlainStateFactory();\r
- final State rootState = f.newState();\r
- final State projectState = f.newState();\r
- final State libraryState = f.newState();\r
- \r
- return new ResourceViewpoint(new TraversalRule() {\r
- @Override\r
- public TraversalDecision makeTraversalDecision(State state, Statement statement) {\r
- Builtins b = statement.getGraph().getBuiltins();\r
- if (state.equals(rootState)) {\r
- if (statement.getObject().isInstanceOf(b.Ontology))\r
- return TraversalDecision.stopTraversal;\r
- if(!statement.getPredicate().equals(b.ConsistsOf))\r
- return TraversalDecision.stopTraversal;\r
- return TraversalDecision.continueTraversal(projectState);\r
- } else if (state.equals(projectState)) {\r
- if(!statement.getPredicate().equals(b.ConsistsOf))\r
- return TraversalDecision.stopTraversal;\r
- return TraversalDecision.continueTraversal(libraryState);\r
- } else if (state.equals(libraryState)) {\r
- if(!statement.getPredicate().equals(b.ConsistsOf))\r
- return TraversalDecision.stopTraversal;\r
- return TraversalDecision.continueTraversal(libraryState);\r
- }\r
- return TraversalDecision.stopTraversal;\r
- }\r
- \r
- @Override\r
- public boolean areAllStatesRelevant() {\r
- return true;\r
- }\r
- \r
- @Override\r
- public Collection<State> relevantStates() {\r
- return null;\r
- }\r
- }, new AcceptRule<IEntity>() {\r
- @Override\r
- public AcceptDecision makeAcceptDecision(State state, IEntity obj) {\r
- Builtins b = obj.getGraph().getBuiltins();\r
- //NOSEResource nr = NOSEResource.getInstance(obj.getGraph());\r
- if(obj.isInstanceOf(b.Project)) return AcceptDecision.REJECT;\r
- else if (obj.isInstanceOf(b.Ontology)) return AcceptDecision.REJECT;\r
- else return AcceptDecision.ACCEPT;\r
- }\r
- \r
- @Override\r
- public boolean areAllStatesRelevant() {\r
- return true;\r
- }\r
- \r
- @Override\r
- public Collection<State> relevantStates() {\r
- return null;\r
- }\r
- }, rootState);\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.dialogs;\r
-\r
-import java.util.List;\r
-\r
-import org.eclipse.jface.dialogs.Dialog;\r
-import org.eclipse.jface.dialogs.IDialogConstants;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.eclipse.swt.widgets.Tree;\r
-import org.eclipse.swt.widgets.TreeItem;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
-import org.simantics.proconf.g3d.tools.PropertyTree;\r
-\r
-public class PropertySelectionDialog extends Dialog {\r
- String title = null;\r
- String message = null;\r
- \r
- Session session;\r
- PropertyTree propertyTree;\r
- Resource[] selectedTypes = null;\r
- List<Resource> selectedPropertyInstances = null;\r
- List<Resource> selectedInstances = null;\r
- \r
- public PropertySelectionDialog(Shell parentShell, String dialogTitle, String dialogMessage, Session session, List<Resource> selectedResources) {\r
- super(parentShell);\r
- this.session = session;\r
- this.title = dialogTitle;\r
- this.message = dialogMessage;\r
- this.selectedInstances = selectedResources;\r
- }\r
- \r
- @Override\r
- protected void configureShell(Shell newShell) {\r
- \r
- super.configureShell(newShell);\r
- if (title != null)\r
- newShell.setText(title);\r
- }\r
- \r
- protected Control createDialogArea(Composite parent) {\r
- Composite composite = (Composite) super.createDialogArea(parent);\r
- \r
- Label label = new Label(composite, SWT.WRAP);\r
- label.setText(message);\r
- GridData data = new GridData(GridData.GRAB_HORIZONTAL\r
- | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL\r
- | GridData.VERTICAL_ALIGN_CENTER);\r
- data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);\r
- label.setLayoutData(data);\r
- label.setFont(parent.getFont());\r
- \r
- Tree tree = new Tree(composite,SWT.SINGLE);\r
- propertyTree = new PropertyTree(tree,session);\r
-\r
- GridData data2 = new GridData(GridData.GRAB_HORIZONTAL\r
- | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL\r
- | GridData.VERTICAL_ALIGN_FILL);\r
- data2.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);\r
- data2.heightHint = 200;\r
- tree.setLayoutData(data2);\r
- tree.setFont(parent.getFont());\r
- \r
- tree.showSelection();\r
- \r
- applyDialogFont(composite);\r
- \r
- //propertyTree.setProperties(selectionAdapter.getCurrentSelection());\r
- propertyTree.setProperties(selectedInstances);\r
- return composite;\r
- }\r
- \r
- @Override\r
- public boolean close() {\r
- TreeItem selected[] = propertyTree.getTree().getSelection();\r
- if (selected.length == 0) {\r
- selectedTypes = null;\r
- } else {\r
- selectedTypes = new Resource[selected.length];\r
- for (int i = 0; i < selected.length; i++) {\r
- selectedTypes[i] = (Resource)selected[i].getData();\r
- }\r
- }\r
- //final ArrayList<Resource> instances = new ArrayList<Resource>();\r
-// for (Resource rs : selectionAdapter.getCurrentSelection().getSelectionList()) {\r
-// instances.add(rs);\r
-// }\r
-\r
- \r
- session.syncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- selectedPropertyInstances = propertyTree.findPropertyInstances(g,selectedInstances);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
-\r
- return super.close();\r
- }\r
- \r
- public List<Resource> getSelectedPropertyInstances() {\r
- return selectedPropertyInstances;\r
- }\r
-\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.handlers;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.adaption.AdaptionException;\r
-import org.simantics.db.adaption.ResourceAdapter;\r
-\r
-\r
-public class CSGProjectAdapter implements ResourceAdapter {\r
- @SuppressWarnings("unchecked")\r
- @Override\r
- public <T> T adapt(Graph graph, Resource resource, Resource mia) throws AdaptionException {\r
- return (T) new CSGProjectType(graph, resource);\r
-\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.handlers;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-\r
-import org.simantics.db.Builtins;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.direct.GraphUtils;\r
-import org.simantics.proconf.ui.projects.IProject;\r
-import org.simantics.proconf.ui.projects.ProjectType;\r
-\r
-public class CSGProjectType extends ProjectType {\r
-\r
- public CSGProjectType(Graph graph, Resource projectTypeResource) {\r
- super(graph, projectTypeResource);\r
- }\r
-\r
- @Override\r
- public Resource createProject(Graph g, String name) throws Exception {\r
- Resource project = super.createProject(g, name);\r
- Builtins b = g.getBuiltins();\r
- \r
- { // Models\r
- Resource modelLibrary = g.newResource(); \r
- g.addStatement(modelLibrary, b.InstanceOf, b.ModelLibrary);\r
- GraphUtils.addRelatedScalarString(g, modelLibrary, b.HasName, "Models");\r
- g.addStatement(project, b.ConsistsOf, modelLibrary); \r
- }\r
- \r
- \r
- \r
- return project;\r
- }\r
- \r
- @Override\r
- public IProject loadProject(Graph g, Resource r) {\r
- IProject project = super.loadProject(g, r);\r
- project.set(DefaultPerspective, "org.simantics.proconf.shapeeditor.perspectives.csg");\r
- Collection<String> perspectives = new ArrayList<String>();\r
- perspectives.add("org.simantics.proconf.shapeeditor.perspectives.csg");\r
- project.set(Perspectives, perspectives);\r
- \r
- return project;\r
- }\r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.handlers;\r
-\r
-import org.eclipse.core.commands.AbstractHandler;\r
-import org.eclipse.core.commands.ExecutionEvent;\r
-import org.eclipse.core.commands.ExecutionException;\r
-import org.eclipse.jface.viewers.ISelection;\r
-import org.eclipse.jface.viewers.IStructuredSelection;\r
-import org.eclipse.ui.handlers.HandlerUtil;\r
-import org.simantics.proconf.g3d.csg.stubs.CSGModel;\r
-\r
-import org.simantics.proconf.ui.ProConfUI;\r
-import org.simantics.proconf.ui.utils.ResourceAdaptionUtils;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.stubs.Library;\r
-\r
-\r
-public class NewCSGModelHandler extends AbstractHandler {\r
-\r
- @Override\r
- public Object execute(ExecutionEvent event) throws ExecutionException {\r
- ISelection s = HandlerUtil.getCurrentSelectionChecked(event);\r
- IStructuredSelection ss = (IStructuredSelection) s;\r
- if (ss.size() != 1)\r
- return null;\r
- final Resource lib = ResourceAdaptionUtils.toSingleResource(ss);\r
- ProConfUI.getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- CSGModel model = CSGModel.createDefault(g);\r
- Library l = new Library(g, lib);\r
- l.addStatement(g.getBuiltins().ConsistsOf, model);\r
- \r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- \r
- return null;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.handlers;\r
-\r
-import org.simantics.proconf.g3d.shapeeditor.Activator;\r
-import org.simantics.proconf.g3d.shapeeditor.ShapeEditorResources;\r
-import org.simantics.proconf.ui.workbench.ResourceEditorInput;\r
-import org.simantics.proconf.ui.workbench.editor.SimpleEditorAdapter;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.utils.ui.BundleUtils;\r
-import org.simantics.utils.ui.workbench.WorkbenchUtils;\r
-\r
-\r
-public class ResourceEditorAdapter1 extends SimpleEditorAdapter {\r
-\r
- public ResourceEditorAdapter1() {\r
- super("ShapeEditor",\r
- BundleUtils.getImageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/union.png"),\r
- null,null,null);\r
- }\r
-\r
- @Override\r
- public boolean canHandle(Graph g, Resource r) {\r
- if(ShapeEditorResources.csgResource == null) return false; \r
- if(ShapeEditorResources.csgResource.CSGModel == null) return false; \r
- return g.isInstanceOf(r, ShapeEditorResources.csgResource.CSGModel);\r
- }\r
-\r
-\r
- @Override\r
- public void openEditor(Resource r) throws Exception {\r
- WorkbenchUtils.openEditor("org.simantics.proconf.shapeeditor.editor1", new ResourceEditorInput("org.simantics.proconf.shapeeditor.editor1",r));\r
-\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.handlers;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.proconf.g3d.shapeeditor.Activator;\r
-import org.simantics.proconf.g3d.shapeeditor.ShapeEditorResources;\r
-import org.simantics.proconf.ui.workbench.ResourceEditorInput;\r
-import org.simantics.proconf.ui.workbench.editor.SimpleEditorAdapter;\r
-import org.simantics.utils.ui.BundleUtils;\r
-import org.simantics.utils.ui.workbench.WorkbenchUtils;\r
-\r
-\r
-public class ResourceEditorAdapter3 extends SimpleEditorAdapter {\r
-\r
- public ResourceEditorAdapter3() {\r
- super("Parameterization Editor",\r
- BundleUtils.getImageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/unlink.png"),\r
- null,null,null);\r
- }\r
-\r
- @Override\r
- public boolean canHandle(Graph g, Resource r) {\r
- if(ShapeEditorResources.csgResource == null) return false; \r
- if(ShapeEditorResources.csgResource.CSGModel == null) return false; \r
- return g.isInstanceOf(r, ShapeEditorResources.csgResource.CSGModel);\r
- }\r
-\r
-\r
- @Override\r
- public void openEditor(Resource r) throws Exception {\r
- WorkbenchUtils.openEditor("org.simantics.proconf.shapeeditor.editor3", new ResourceEditorInput("org.simantics.proconf.shapeeditor.editor3",r));\r
-\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.perspectives;\r
-\r
-import org.eclipse.ui.IPageLayout;\r
-import org.eclipse.ui.IPerspectiveFactory;\r
-\r
-public class CSGModellingPerspective implements IPerspectiveFactory {\r
-\r
- @Override\r
- public void createInitialLayout(IPageLayout layout) {\r
- \r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.scenegraph;\r
-\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.proconf.g3d.base.GeometryProviderRegistry;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.scenegraph.ShapeNode;\r
-\r
-import com.jme.scene.Geometry;\r
-import com.jme.scene.state.AlphaState;\r
-import com.jme.scene.state.ZBufferState;\r
-\r
-\r
-\r
-public class CSGShapeNode extends ShapeNode{\r
-\r
- \r
- //protected Geometry axesGeometry = null;\r
- protected boolean axesVisible = false;\r
-\r
- public CSGShapeNode(ThreeDimensionalEditorBase editor,IGraphicsNode parent, Graph graph, Resource shapeResource) {\r
- super(editor,parent, graph,shapeResource);\r
- //axesGeometry = AxesShape.getShape(editor.getRenderingComponent().getDisplaySystem().getRenderer());\r
- ZBufferState zs = editor.getRenderingComponent().getDisplaySystem().getRenderer().createZBufferState();\r
- zs.setFunction(ZBufferState.CF_ALWAYS);\r
- AlphaState as = editor.getRenderingComponent().getDisplaySystem().getRenderer().createAlphaState();\r
- as.setBlendEnabled(true);\r
- as.setDstFunction(AlphaState.DB_ONE_MINUS_SRC_ALPHA);\r
- as.setSrcFunction(AlphaState.DB_SRC_ALPHA);\r
-// axesGeometry.setRenderState(zs);\r
-// axesGeometry.setRenderState(as);\r
-// axesGeometry.setRenderQueueMode(Renderer.QUEUE_TRANSPARENT);\r
- }\r
-\r
- \r
-\r
- public Geometry[] getGeometry(Graph graph) {\r
- \r
- return GeometryProviderRegistry.getGeometry(getG3DNode(graph), false);\r
- }\r
- \r
- public void updateAllGeometry() {\r
- //System.out.println("CSGSHapeNode.updateAllGeometry " + shapeResource.getResourceId());\r
- editor.getScenegraphAdapter().updateGeometry(shapeResource);\r
- if (parent != null && parent instanceof CSGShapeNode) {\r
- ((CSGShapeNode)parent).updateAllGeometry();\r
- }\r
- \r
- }\r
- \r
- @Override\r
- public void updateGeometry(Graph graph) {\r
- super.updateGeometry(graph);\r
- if (isAxesVisible()) {\r
- //getGroup().attachChild(axesGeometry);\r
- } else {\r
- //axesGeometry.removeFromParent();\r
- }\r
- }\r
-\r
-\r
- \r
- public boolean isAxesVisible() {\r
- return axesVisible;\r
- }\r
-\r
- public void setAxesVisible(boolean axesVisible) {\r
- \r
- if (this.axesVisible == axesVisible)\r
- return;\r
- this.axesVisible = axesVisible;\r
- if (isAxesVisible()) {\r
- //getGroup().getParent().attachChild(axesGeometry);\r
- //getGroup().attachChild(axesGeometry);\r
- } else {\r
- //axesGeometry.removeFromParent();\r
- }\r
- }\r
- \r
- public void setSelected(boolean selected) {\r
- if (this.selected == selected)\r
- return;\r
- this.selected = selected;\r
- if (selected) {\r
-\r
- setSelectedVisible(true);\r
- setAxesVisible(true);\r
- setTransparentVisible(true);\r
- } else {\r
- setSelectedVisible(false);\r
- setAxesVisible(false);\r
- setTransparentVisible(false);\r
- }\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.tools;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.List;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.Quat4d;\r
-\r
-import org.eclipse.jface.action.IMenuManager;\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.eclipse.jface.dialogs.Dialog;\r
-import org.eclipse.jface.dialogs.InputDialog;\r
-import org.eclipse.jface.dialogs.MessageDialog;\r
-import org.eclipse.jface.viewers.ISelectionChangedListener;\r
-import org.eclipse.jface.viewers.SelectionChangedEvent;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.custom.CCombo;\r
-import org.eclipse.swt.events.FocusAdapter;\r
-import org.eclipse.swt.events.FocusEvent;\r
-import org.eclipse.swt.events.KeyAdapter;\r
-import org.eclipse.swt.events.KeyEvent;\r
-import org.eclipse.swt.events.SelectionAdapter;\r
-import org.eclipse.swt.events.SelectionEvent;\r
-import org.eclipse.swt.layout.FillLayout;\r
-import org.eclipse.swt.layout.FormAttachment;\r
-import org.eclipse.swt.layout.FormData;\r
-import org.eclipse.swt.layout.FormLayout;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.layout.GridLayout;\r
-import org.eclipse.swt.widgets.Button;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Slider;\r
-import org.eclipse.swt.widgets.Text;\r
-import org.simantics.db.ContextGraph;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.GraphRequestWithResult;\r
-import org.simantics.db.Resource;\r
-import org.simantics.animation.stubs.Animation;\r
-import org.simantics.animation.stubs.Interpolator;\r
-import org.simantics.animation.stubs.ScalarInterpolator;\r
-import org.simantics.animation.stubs.SlerpInterpolator;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.Property;\r
-import org.simantics.animation.curve.SlerpCurve;\r
-import org.simantics.animation.curve.TCBCurve;\r
-import org.simantics.proconf.g3d.actions.ContextAction;\r
-import org.simantics.proconf.g3d.actions.RotateAction;\r
-import org.simantics.proconf.g3d.actions.TranslateAction;\r
-import org.simantics.proconf.g3d.animation.Animatable;\r
-import org.simantics.proconf.g3d.base.EditorContribution;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.base.VisualizationScheduler;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.scenegraph.ISelectableNode;\r
-import org.simantics.proconf.g3d.shapeeditor.ShapeEditorResources;\r
-import org.simantics.proconf.g3d.shapeeditor.dialogs.PropertySelectionDialog;\r
-import org.simantics.proconf.g3d.shapeeditor.views.ShapeEditorBase;\r
-import org.simantics.proconf.g3d.stubs.G3DModel;\r
-import org.simantics.proconf.g3d.stubs.Orientation;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-public class AnimationContribution implements EditorContribution {\r
- List<ContextAction> actions = new ArrayList<ContextAction>();\r
- \r
- private ShapeEditorBase parent;\r
- \r
- private final String NO_ANIMATION = "None";\r
-\r
- private Slider timeSlider;\r
- private double key = 0;\r
- private Composite buttonComposite;\r
- private Button insertKeyFrameButton;\r
- private Button clearKeyFrameButton;\r
- private CCombo animationCombo;\r
- private Button addAnimationButton;\r
- private Button removeAnimationButton;\r
- private Button clearAnimationButton;\r
- private Button animateButton;\r
- private Button usePrecalculation;\r
- private Text timeText;\r
- private Composite infoComposite;\r
- private Text infoText;\r
-\r
- private Resource animationResource;\r
- \r
- private ContextAction translateAction;\r
- private ContextAction rotateAction;\r
- \r
- public AnimationContribution(ThreeDimensionalEditorBase parent) {\r
- this.parent = (ShapeEditorBase)parent;\r
- }\r
- \r
- @Override\r
- public String getName() {\r
- return "Animator";\r
- }\r
- \r
- @Override\r
- public void createControl(Composite parent) {\r
- FormLayout flayout = new FormLayout();\r
- parent.setLayout(flayout);\r
- infoComposite = new Composite(parent, SWT.BORDER);\r
- FormData data = new FormData();\r
- data.top = new FormAttachment(0, 0);\r
- data.left = new FormAttachment(0, 0);\r
- data.right = new FormAttachment(100, 0);\r
- data.bottom = new FormAttachment(infoComposite, 0, SWT.TOP);\r
- this.parent.getRenderingComposite().setLayoutData(data);\r
-\r
- infoComposite.setLayout(new FillLayout(SWT.VERTICAL));\r
- infoText = new Text(infoComposite, SWT.NONE);\r
- GridLayout layout = new GridLayout(2, false);\r
- layout.horizontalSpacing = 2;\r
- layout.verticalSpacing = 2;\r
- layout.marginWidth = 1;\r
- layout.marginHeight = 1;\r
- infoComposite.setLayout(layout);\r
- GridData gdata = new GridData(SWT.BEGINNING, SWT.CENTER, true, false, 2, 1);\r
- // FIXME : allows text widget to take all available space (horizontal / width)\r
- gdata.widthHint = 2000;\r
- infoText.setLayoutData(gdata);\r
- timeSlider = new Slider(infoComposite, SWT.NONE);\r
- timeSlider.setValues(0, 0, 100, 1, 1, 1);\r
- timeSlider.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- key = ((double) timeSlider.getSelection()) / 100.0;\r
- updateTime();\r
- }\r
- });\r
- timeSlider.setLayoutData(new GridData(SWT.FILL, 1, true, false));\r
- timeText = new Text(infoComposite, SWT.SINGLE);\r
- timeText.addFocusListener(new FocusAdapter() {\r
- @Override\r
- public void focusLost(FocusEvent e) {\r
- updateTime();\r
- }\r
- });\r
- timeText.addKeyListener(new KeyAdapter() {\r
- @Override\r
- public void keyReleased(KeyEvent e) {\r
- if (e.keyCode == SWT.CR)\r
- updateTime();\r
- }\r
- });\r
-\r
- buttonComposite = new Composite(infoComposite, SWT.NONE);\r
- buttonComposite.setLayout(new FillLayout(SWT.HORIZONTAL));\r
- buttonComposite.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false, 2, 1));\r
- insertKeyFrameButton = new Button(buttonComposite, SWT.PUSH);\r
- insertKeyFrameButton.setText("Insert Keyframe");\r
- insertKeyFrameButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- insertKeyFrame();\r
- }\r
- });\r
-\r
- clearKeyFrameButton = new Button(buttonComposite, SWT.PUSH);\r
- clearKeyFrameButton.setText("Clear Keyframe");\r
-\r
- animationCombo = new CCombo(buttonComposite, SWT.NONE);\r
- animationCombo.add(NO_ANIMATION);\r
- animationCombo.select(0);\r
- animationCombo.setEditable(false);\r
- animationCombo.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- selectAnimation();\r
- }\r
- });\r
-\r
- addAnimationButton = new Button(buttonComposite, SWT.PUSH);\r
- addAnimationButton.setText("New Animation");\r
- addAnimationButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- addAnimation();\r
- }\r
- });\r
-\r
- clearAnimationButton = new Button(buttonComposite, SWT.PUSH);\r
- clearAnimationButton.setText("Clear Animation");\r
- clearAnimationButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- clearAnimation();\r
- }\r
- });\r
-\r
- removeAnimationButton = new Button(buttonComposite, SWT.PUSH);\r
- removeAnimationButton.setText("Remove Animation");\r
- removeAnimationButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- removeAnimation();\r
- }\r
- });\r
-\r
- animateButton = new Button(buttonComposite, SWT.TOGGLE);\r
- animateButton.setText("Animate");\r
- animateButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- animate();\r
- }\r
- });\r
-\r
- usePrecalculation = new Button(buttonComposite, SWT.CHECK);\r
- usePrecalculation.setText("Precalc");\r
-\r
- data = new FormData();\r
- data.left = new FormAttachment(0, 0);\r
- data.right = new FormAttachment(100, 0);\r
- data.bottom = new FormAttachment(100, 0);\r
- // FIXME : take account font size\r
- data.height = 20 * 3;\r
- infoComposite.setLayoutData(data);\r
-\r
- this.parent.getSelectionAdapter().addSelectionChangedListener(new ISelectionChangedListener() {\r
- public void selectionChanged(SelectionChangedEvent event) {\r
- updateUI();\r
- }\r
- });\r
- updateUI();\r
- \r
- this.parent.getSession().asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- G3DModel m = new G3DModel(g,AnimationContribution.this.parent.getModelResource());\r
- Collection<Animation> animations = m.getAnimation();\r
-\r
- final List<String> animationNames = new ArrayList<String>();\r
- for (Animation a : animations) {\r
- animationNames.add(a.getName());\r
- }\r
- AnimationContribution.this.parent.getRenderingComposite().getDisplay().asyncExec(new Runnable() {\r
- public void run() {\r
- for (String s : animationNames)\r
- animationCombo.add(s);\r
- }\r
- });\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- });\r
- }\r
- \r
- @Override\r
- public void disposeControl() {\r
- if (animateRunnable != null)\r
- VisualizationScheduler.getInstance().removeVisualization(animateRunnable);\r
- animateRunnable = null;\r
- \r
- infoComposite.dispose();\r
-\r
- }\r
- \r
- @Override\r
- public void fillContextMenu(Graph graph, IMenuManager manager, StructuredResourceSelection selection) {\r
-\r
- }\r
- \r
- \r
- \r
- @Override\r
- public Collection<ContextAction> getActions() {\r
- return actions;\r
- }\r
- \r
- @Override\r
- public void initialize(Graph graph) {\r
- actions.add(translateAction = new TranslateAction(parent) {\r
- @Override\r
- public void setInfoText(String text) {\r
- infoText.setText(text);\r
- }\r
- });\r
- actions.add(rotateAction = new RotateAction(parent){\r
- @Override\r
- public void setInfoText(String text) {\r
- infoText.setText(text);\r
- }\r
- });\r
- }\r
- \r
- private double getCurrentKey() {\r
- return key;\r
- }\r
- \r
- private void updateTime() {\r
- final double t = getCurrentKey();\r
- timeText.setText(Double.toString(t));\r
- if (animationResource == null)\r
- return;\r
- if (usePrecalculation.getSelection()) {\r
- for (IGraphicsNode n : parent.getScenegraphAdapter().getNodes()) {\r
- if (n instanceof Animatable) {\r
- // TODO : frame-rate dependent animations\r
- ((Animatable)n).animate(t,0.0);\r
- }\r
- parent.setViewChanged(true);\r
- } \r
- } else {\r
- parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- Collection<IEntity> interpolators = getAnimation(g).getRelatedObjects(ShapeEditorResources.animationResource.HasInterpolator);\r
- for (IEntity i : interpolators) {\r
- if (i.isInstanceOf(ShapeEditorResources.animationResource.ScalarInterpolator)) {\r
- // TODO : creating curve each time when time is set is\r
- // slow. Curve should be cached\r
- TCBCurve c = (TCBCurve) ShapeEditorResources.curveBuilder.loadInterpolator(i);\r
- double out = c.evaluate(t);\r
- g.setScalarDouble(i.getSingleRelatedObject(ShapeEditorResources.animationResource.HasTarget).getResource(), out);\r
- } else if (i.isInstanceOf(ShapeEditorResources.animationResource.SlerpInterpolator)) {\r
- // TODO : creating curve each time when time is set is slow.\r
- // Curve should be cached\r
- SlerpCurve c = (SlerpCurve) ShapeEditorResources.curveBuilder.loadInterpolator(i);\r
- Quat4d out = c.evaluate(t);\r
- Orientation r = new Orientation(i.getSingleRelatedObject(ShapeEditorResources.animationResource.HasTarget));\r
- AxisAngle4d aa = new AxisAngle4d();\r
- aa.set(out);\r
- G3DTools.setOrientation(r, aa);\r
- }\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- @Override\r
- public void requestCompleted(GraphRequestStatus status) {\r
- parent.getScenegraphAdapter().setChanged(true);\r
- }\r
- }); \r
- }\r
- }\r
- \r
- private IEntity findPropertyInterpolator(Graph g, Resource property) {\r
- Collection<IEntity> interpolators = getAnimation(g).getRelatedObjects(ShapeEditorResources.animationResource.HasInterpolator);\r
- for (IEntity i : interpolators) {\r
- IEntity e = i.getAtMostOneRelatedObject(ShapeEditorResources.animationResource.HasTarget);\r
- if (e == null)\r
- continue;\r
- if (e.getResource().equals(property)) {\r
- return i;\r
- }\r
- }\r
- return null;\r
- }\r
- \r
- private void insertKeyFrame() {\r
- ArrayList<Resource> instances = new ArrayList<Resource>();\r
- for (Resource rs : parent.getSelectionAdapter().getCurrentSelection().getSelectionList()) {\r
- instances.add(rs);\r
- }\r
- PropertySelectionDialog dialog = new PropertySelectionDialog(parent.getRenderingComposite().getShell(),"Select property","Select animated property",parent.getSession(),instances);\r
- if (dialog.open() == Dialog.CANCEL) {\r
- return;\r
- }\r
- final List<Resource> properties = dialog.getSelectedPropertyInstances(); \r
- parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- for (Resource r : properties) {\r
- IEntity t = EntityFactory.create(g,r);\r
- IEntity current = findPropertyInterpolator(g, r);\r
- if (t.isInstanceOf(ShapeEditorResources.g3dResource.Position)) {\r
- \r
- for (int i = 0; i < 3; i++) {\r
- IEntity d = null;\r
- switch (i) {\r
- case 0:\r
- d = t.getSingleRelatedObject(ShapeEditorResources.g3dResource.HasX);\r
- break;\r
- case 1:\r
- d = t.getSingleRelatedObject(ShapeEditorResources.g3dResource.HasY);\r
- break;\r
- case 2:\r
- d = t.getSingleRelatedObject(ShapeEditorResources.g3dResource.HasZ);\r
- break;\r
- }\r
- current = findPropertyInterpolator(g, d.getResource());\r
- addScalarKey(current,d);\r
- }\r
- \r
- } else if (t.isInstanceOf(ShapeEditorResources.g3dResource.Orientation)) {\r
- Orientation rot = new Orientation(t);\r
- addSlerpKey(current, rot);\r
- } else if (t.isInstanceOf(ShapeEditorResources.g3dResource.Color)) {\r
- for (int i = 0; i < 3; i++) {\r
- IEntity d = null;\r
- switch (i) {\r
- case 0:\r
- d = t.getSingleRelatedObject(ShapeEditorResources.g3dResource.HasRed);\r
- break;\r
- case 1:\r
- break;\r
- case 2:\r
- break;\r
- }\r
- current = findPropertyInterpolator(g, d.getResource());\r
- addScalarKey(current,d);\r
- }\r
- } else if (t.isInstanceOf(g.getBuiltins().Double)) {\r
- addScalarKey(current,t);\r
- } else {\r
- // TODO: basic cases are handled, only way to support\r
- // is to find all doubles from property structure and\r
- // interpolators attached to them, if there's any\r
- ErrorLogger.getDefault().logWarning("Default keyframe adding has not been implemented", null);\r
- }\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- }\r
- \r
- private void addScalarKey(IEntity current, IEntity d) {\r
- \r
- Graph graph = d.getGraph();\r
- if (current == null) {\r
- current = ScalarInterpolator.createDefault(graph).toInterpolator(); // FIXME : stubcast\r
- getAnimation(graph).addStatement(ShapeEditorResources.animationResource.HasInterpolator, current);\r
- current.addStatement(ShapeEditorResources.animationResource.HasTarget, d);\r
- }\r
- ShapeEditorResources.curveBuilder.addKey(current,getCurrentKey(),new double[]{d.getGraph().getScalarDouble(d.getResource()),0.0,0.0,0.0});\r
- }\r
- \r
- private void addSlerpKey(IEntity current, Orientation r) {\r
- Graph graph = r.getGraph();\r
- if (current == null) {\r
- current = SlerpInterpolator.createDefault(graph).toInterpolator(); // FIXME : stubcast\r
- getAnimation(graph).addStatement(ShapeEditorResources.animationResource.HasInterpolator, current);\r
- current.addStatement(ShapeEditorResources.animationResource.HasTarget, r);\r
- \r
- }\r
- AxisAngle4d aa = G3DTools.getOrientation(r);\r
- Quat4d q = new Quat4d();\r
- q.set(aa);\r
- ShapeEditorResources.curveBuilder.addKey(current,getCurrentKey(),new double[]{q.w,q.x,q.y,q.z}); \r
- }\r
- \r
- private void selectAnimation() {\r
- if (animationCombo.getSelectionIndex() == 0) {\r
- animationResource = null;\r
- updateUI();\r
- } else {\r
- final String name = animationCombo.getItem(animationCombo.getSelectionIndex());\r
- parent.getSession().asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- \r
- Resource modelResource = parent.getModelResource();\r
- G3DModel m = new G3DModel(g, modelResource);\r
- Collection<Animation> animations = m.getAnimation();\r
- boolean found = false;\r
- for (Animation a : animations) {\r
- if (a.getName().startsWith(name) && a.getName().length() == name.length()) {\r
- animationResource = a.getResource();\r
- found = true;\r
- break;\r
- }\r
- }\r
- if (!found) {\r
- ErrorLogger.defaultLogError("Could find animation " + name + " for model " + m.getResource(), null);\r
- animationResource = null;\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- @Override\r
- public void requestCompleted(GraphRequestStatus status) {\r
- parent.getRenderingComposite().getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- updateUI(); \r
- }\r
- });\r
- }\r
- });\r
- } \r
- }\r
- \r
- private Animation getAnimation(Graph graph) {\r
- return new Animation(graph, animationResource);\r
- }\r
-\r
- private void addAnimation() {\r
- InputDialog d = new InputDialog(parent.getRenderingComposite().getShell(),"Animation name","Animation name","",null);\r
- if (d.open() == InputDialog.CANCEL) {\r
- return;\r
- }\r
- final String name = d.getValue();\r
- if (name == null || name.length() == 0) {\r
- return;\r
- }\r
- parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- G3DModel m = parent.getModel(g);\r
- Collection<IEntity> animations = m.getRelatedObjects(ShapeEditorResources.animationResource.HasAnimation);\r
- for (IEntity a : animations) {\r
- if (a.getName().startsWith(name) && a.getName().length() == name.length()) {\r
- ErrorLogger.getDefault().logWarning("Cannot add animation with the same name " + name, null);\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- }\r
-\r
- Animation newAnimation = Animation.createDefault(g);\r
- newAnimation.setName(name);\r
- m.addStatement(ShapeEditorResources.animationResource.HasAnimation, newAnimation);\r
- \r
- return GraphRequestStatus.transactionComplete();\r
- }\r
-\r
- @Override\r
- public void requestCompleted(GraphRequestStatus status) {\r
- parent.getRenderingComposite().getDisplay().asyncExec(new Runnable() {\r
- public void run() {\r
- animationCombo.add(name);\r
- animationCombo.select(animationCombo.indexOf(name));\r
- selectAnimation();\r
- }\r
- });\r
- }\r
- }); \r
- }\r
- \r
- private void removeAnimation() {\r
- assert(animationResource != null);\r
- GraphRequestWithResult<String> r = new GraphRequestWithResult<String>() {\r
- public String performWithResult(Graph g) throws Exception {\r
- return getAnimation(g).getName();\r
- };\r
- };\r
- parent.getSession().syncRead(r);\r
- MessageDialog dialog = new MessageDialog(parent.getRenderingComposite().getShell(),"Confirm",null,"Do you want to remove animation " + r.getResult() ,MessageDialog.QUESTION,new String[]{"Yes","No"},1);\r
- if (dialog.open() == 1)\r
- return;\r
- parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
- String name;\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- \r
- Animation currentAnimation = getAnimation(g);\r
- name = currentAnimation.getName();\r
- parent.getModel(g).removeStatement(ShapeEditorResources.animationResource.HasAnimation, currentAnimation);\r
- \r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- @Override\r
- public void requestCompleted(GraphRequestStatus status) {\r
- parent.getRenderingComposite().getDisplay().asyncExec(new Runnable() {\r
- public void run() {\r
- animationCombo.remove(animationCombo.indexOf(name));\r
- }\r
- }); \r
- }\r
- });\r
- }\r
- \r
- private void clearAnimation() {\r
- assert(animationResource != null); \r
- \r
- parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
- \r
- boolean proceed;\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- int size = getAnimation(g).getInterpolator().size();\r
- if (size == 0)\r
- return GraphRequestStatus.transactionCancel();\r
- final String name = getAnimation(g).getName();\r
- parent.getRenderingComposite().getDisplay().syncExec(new Runnable() {\r
- public void run() {\r
- MessageDialog dialog = new MessageDialog(parent.getRenderingComposite().getShell(),"Confirm",null,"Do you want to clear animation " + name ,MessageDialog.QUESTION,new String[]{"Yes","No"},1);\r
- proceed = (dialog.open() != MessageDialog.CANCEL);\r
- }\r
- });\r
- if (proceed) {\r
- //getAnimation(g).getInterpolator().clear();\r
- getAnimation(g).removeRelatedStatements(ShapeEditorResources.animationResource.HasInterpolator);\r
- return GraphRequestStatus.transactionComplete();\r
- } else {\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- }\r
- });\r
- }\r
- \r
- public Graph createAnimationParameterization(Graph g) {\r
- if (g.getObjects(parent.getModelResource(), ShapeEditorResources.g3dResource.HasSizingParameter).size() > 0) {\r
- ContextGraph graph;\r
- if (!(g instanceof ContextGraph)) {\r
- graph = new ContextGraph(g);\r
- graph.setContext(parent.getModelResource());\r
- } else {\r
- graph = (ContextGraph)g;\r
- }\r
- Animation animation = getAnimation(graph);\r
- Collection<Interpolator> interpolators = animation.getInterpolator();\r
- for (org.simantics.animation.stubs.Interpolator interpolator : interpolators) {\r
- IEntity target = interpolator.getTarget();\r
- // check all model properties\r
- G3DModel model = parent.getModel(graph);\r
- Collection<Property> modelProperties = model.getRelatedProperties(ShapeEditorResources.g3dResource.HasSizingParameter);\r
- for (Property p : modelProperties) {\r
- IEntity t = EntityFactory.create(graph,p.getResource());\r
- // get parameterization equations\r
- Collection<IEntity> equations = t.getRelatedObjects(ShapeEditorResources.equationResource.HasTarget);\r
- // get parameterized values\r
- Collection<IEntity> parameterTargets = new ArrayList<IEntity>();\r
- for (IEntity eq : equations) {\r
- Collection<IEntity> tgts = eq.getRelatedObjects(ShapeEditorResources.equationResource.HasTarget);\r
- assert(tgts.size() == 1);\r
- parameterTargets.add(tgts.iterator().next());\r
- }\r
- // do matching between interpolator targets and parameterized values\r
- // TODO : old system did not have inverse relations but current system does.\r
- // it is possible to take interpolation target and find if it is connected to an equation\r
- // this would make code much faster (no more stupid loops over everything)\r
- for (IEntity d : parameterTargets) {\r
- if (d.getResource().equals(target.getResource())) {\r
- // get default value for sizing property\r
- Collection<IEntity> prop = t.getRelatedObjects(ShapeEditorResources.g3dResource.HasDefaultDoubleValue);\r
- if (prop.size() == 1) {\r
- ShapeEditorResources.curveBuilder.parameterize(interpolator, prop.iterator().next().toProperty().getDoubleArray(), p.getDoubleArray());\r
- } else {\r
- ErrorLogger.defaultLogError("Cannot parameterize interpolator " + interpolator.getResource() + " of animation " + animation.getResource() + " since parameter " + p.getResource() + " has no default value", null);\r
- }\r
- }\r
- }\r
- }\r
- }\r
- \r
- return graph;\r
- } else {\r
- return g;\r
- }\r
- }\r
- \r
- private AnimateRunnable animateRunnable = null;\r
- \r
- private void animate() {\r
- updateUI();\r
- if (animateButton.getSelection()) {\r
- if (animateRunnable != null)\r
- return;\r
- if (usePrecalculation.getSelection()) {\r
- parent.getSession().asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- Graph graph = parent.createParameterization(g);\r
- createAnimationParameterization(graph);\r
- for (IGraphicsNode n : parent.getScenegraphAdapter().getNodes()) {\r
- if (n instanceof ISelectableNode) {\r
- if (!((ISelectableNode)n).isVisible())\r
- continue;\r
- }\r
- if (n instanceof Animatable) {\r
- ((Animatable)n).setAnimation(graph,animationResource);\r
- }\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- @Override\r
- public void requestCompleted(GraphRequestStatus status) {\r
- animateRunnable = new AnimateRunnable();\r
- VisualizationScheduler.getInstance().addVisualization(animateRunnable);\r
- }\r
- });\r
- } else {\r
- animateRunnable = new AnimateRunnable();\r
- VisualizationScheduler.getInstance().addVisualization(animateRunnable);\r
- }\r
- \r
- } else {\r
- if (animateRunnable == null)\r
- return; \r
- VisualizationScheduler.getInstance().removeVisualization(animateRunnable);\r
- animateRunnable = null;\r
- if (usePrecalculation.getSelection()) {\r
- // updateTime updates values to graph if precalculation is not used.\r
- // we must store current values from animation to synchronize view and graph\r
- // information so that use can modify animation properly.\r
- usePrecalculation.setSelection(false);\r
- updateTime();\r
- usePrecalculation.setSelection(true);\r
- for (IGraphicsNode n : parent.getScenegraphAdapter().getNodes()) {\r
- if (n instanceof Animatable) {\r
- ((Animatable)n).setAnimation(null,null);\r
- }\r
- }\r
- }\r
- }\r
- }\r
- \r
- private void updateUI() {\r
- if (animationResource != null) {\r
- animateButton.setEnabled(true);\r
- timeSlider.setEnabled(true);\r
- if (animateButton.getSelection()) {\r
- addAnimationButton.setEnabled(false);\r
- insertKeyFrameButton.setEnabled(false);\r
- removeAnimationButton.setEnabled(false);\r
- clearKeyFrameButton.setEnabled(false);\r
- animationCombo.setEnabled(false);\r
- usePrecalculation.setEnabled(false);\r
- clearAnimationButton.setEnabled(false);\r
- } else {\r
- addAnimationButton.setEnabled(true);\r
- insertKeyFrameButton.setEnabled(!parent.getSelectionAdapter().getCurrentSelection().isEmpty());\r
- removeAnimationButton.setEnabled(true);\r
- clearKeyFrameButton.setEnabled(false); //FIXME : detect keyframes\r
- animationCombo.setEnabled(true);\r
- usePrecalculation.setEnabled(true);\r
- clearAnimationButton.setEnabled(true);\r
- } \r
- } else {\r
- timeSlider.setEnabled(false);\r
- addAnimationButton.setEnabled(true);\r
- insertKeyFrameButton.setEnabled(false);\r
- removeAnimationButton.setEnabled(false);\r
- clearKeyFrameButton.setEnabled(false);\r
- animateButton.setEnabled(false);\r
- animateButton.setSelection(false);\r
- animationCombo.setEnabled(true);\r
- usePrecalculation.setEnabled(false);\r
- clearAnimationButton.setEnabled(false);\r
- }\r
- }\r
- \r
- private void updateKey(double k) {\r
- key = k;\r
- if (key >= 1.0)\r
- key = 0.0;\r
- else if (key < 0.0)\r
- key = 1.0;\r
- timeSlider.setSelection((int)(key*100.0));\r
- }\r
- \r
- private class AnimateRunnable implements Runnable {\r
- public void run() {\r
- try {\r
- updateKey(key + 0.01);\r
- updateTime();\r
- } catch (Exception e) {\r
- VisualizationScheduler.getInstance().removeVisualization(animateRunnable);\r
- }\r
- }\r
- }\r
- \r
- @Override\r
- public void fillLocalToolBar(IToolBarManager manager) {\r
-\r
- }\r
- \r
- @Override\r
- public void fillLocalPullDown(IMenuManager manager) {\r
- \r
- }\r
- \r
- @Override\r
- public void dispose() {\r
- \r
- }\r
- \r
- @Override\r
- public void run() {\r
-\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.tools;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.TreeMap;\r
-import java.util.Map.Entry;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.Point3d;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.jface.action.IMenuManager;\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.eclipse.jface.action.MenuManager;\r
-import org.eclipse.jface.resource.ImageDescriptor;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.layout.FormAttachment;\r
-import org.eclipse.swt.layout.FormData;\r
-import org.eclipse.swt.layout.FormLayout;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.layout.GridLayout;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Text;\r
-import org.eclipse.ui.ISharedImages;\r
-import org.eclipse.ui.PlatformUI;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.stubs.Property;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.instantiation.Instance;\r
-import org.simantics.layer0.utils.instantiation.InstanceFactory;\r
-import org.simantics.proconf.g3d.actions.ContextAction;\r
-import org.simantics.proconf.g3d.actions.FocusAction;\r
-import org.simantics.proconf.g3d.actions.RemoveAction;\r
-import org.simantics.proconf.g3d.actions.RotateAction;\r
-import org.simantics.proconf.g3d.actions.TranslateAction;\r
-import org.simantics.proconf.g3d.actions.WriteAction;\r
-import org.simantics.proconf.g3d.base.EditorContribution;\r
-import org.simantics.proconf.g3d.base.G3DAPI;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-import org.simantics.proconf.g3d.csg.stubs.BooleanOperation;\r
-import org.simantics.proconf.g3d.csg.stubs.CSGModel;\r
-import org.simantics.proconf.g3d.csg.stubs.CSGShape;\r
-import org.simantics.proconf.g3d.csg.stubs.Difference;\r
-import org.simantics.proconf.g3d.csg.stubs.Intersection;\r
-import org.simantics.proconf.g3d.csg.stubs.Primitive;\r
-import org.simantics.proconf.g3d.csg.stubs.Union;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.shapeeditor.Activator;\r
-import org.simantics.proconf.g3d.shapeeditor.ShapeEditorResources;\r
-import org.simantics.proconf.g3d.shapeeditor.views.ShapeEditorBase;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-import org.simantics.proconf.g3d.stubs.Shape;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-public class CSGModellingContribution implements EditorContribution {\r
- \r
- private static ImageDescriptor INTERSECTION_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID,"icons/intersection.png");\r
- private static ImageDescriptor UNION_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/union.png");\r
- private static ImageDescriptor DIFFERENCE_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID,"icons/difference.png");\r
-\r
- private ShapeEditorBase parent;\r
- \r
- private List<ContextAction> actions = new ArrayList<ContextAction>();\r
- \r
- private List<Action> addActions = new ArrayList<Action>();\r
- private ContextAction unionAction;\r
- private ContextAction differenceAction;\r
- private ContextAction intersectionAction;\r
- private ContextAction splitAction;\r
- private ContextAction linkAction;\r
- private ContextAction unlinkAction;\r
- private ContextAction translateAction;\r
- private ContextAction rotateAction;\r
- private ContextAction removeAction;\r
- \r
- private Composite infoComposite;\r
- private Text infoText;\r
- \r
- \r
- public CSGModellingContribution(ThreeDimensionalEditorBase parent) {\r
- this.parent = (ShapeEditorBase)parent; \r
- }\r
- \r
- @Override\r
- public String getName() {\r
- return "Shape Editing";\r
- }\r
- \r
- @Override\r
- public void initialize(Graph graph) {\r
- makeActions(graph);\r
- }\r
- \r
- @Override\r
- public void createControl(Composite parent) {\r
- FormLayout flayout = new FormLayout();\r
- parent.setLayout(flayout);\r
- infoComposite = new Composite(parent, SWT.BORDER);\r
- FormData data = new FormData();\r
- data.top = new FormAttachment(0, 0);\r
- data.left = new FormAttachment(0, 0);\r
- data.right = new FormAttachment(100, 0);\r
- data.bottom = new FormAttachment(infoComposite, 0, SWT.TOP);\r
- this.parent.getRenderingComposite().setLayoutData(data);\r
- data = new FormData();\r
- data.left = new FormAttachment(0, 0);\r
- data.right = new FormAttachment(100, 0);\r
- data.bottom = new FormAttachment(100, 0);\r
- data.height = 18;\r
- infoComposite.setLayoutData(data);\r
- GridLayout layout = new GridLayout(1,false);\r
- layout.marginWidth = 1;\r
- layout.marginHeight = 1;\r
- infoComposite.setLayout(layout);\r
- infoText = new Text(infoComposite, SWT.NONE);\r
- GridData gdata = new GridData();\r
- gdata.grabExcessHorizontalSpace = true;\r
- gdata.horizontalAlignment = SWT.FILL;\r
- infoText.setLayoutData(gdata);\r
- }\r
- \r
- @Override\r
- public void disposeControl() {\r
- infoComposite.dispose();\r
- }\r
- \r
- @Override\r
- public void fillContextMenu(Graph graph, IMenuManager manager, StructuredResourceSelection selection) {\r
-\r
- if (selection.isEmpty()) {\r
- MenuManager addMenu = new MenuManager("Add", "add");\r
- addMenu.setRemoveAllWhenShown(false);\r
- for (Action a : addActions) {\r
- addMenu.add(a);\r
- }\r
- manager.add(addMenu);\r
- }\r
-\r
- }\r
- \r
- protected void makeActions(Graph graph) {\r
- actions.add(translateAction = new TranslateAction(parent) {\r
- @Override\r
- public void setInfoText(String text) {\r
- infoText.setText(text);\r
- }\r
- });\r
- actions.add(rotateAction = new RotateAction(parent){\r
- @Override\r
- public void setInfoText(String text) {\r
- infoText.setText(text);\r
- }\r
- });\r
- actions.add(removeAction = new RemoveAction(parent));\r
- actions.add(new FocusAction(parent));\r
-\r
- \r
- IEntity primitive = EntityFactory.create(graph,ShapeEditorResources.csgResource.Primitive);\r
- \r
- Collection<IEntity> primitives = primitive.getRelatedObjects(graph.getBuiltins().SupertypeOf);\r
-\r
- TreeMap<String, Resource> sorter = new TreeMap<String, Resource>();\r
- for (IEntity p : primitives) {\r
- String key = p.getName();\r
- if (key.equals(""))\r
- key = "ERROR (" + p.getURI() + ")";\r
- sorter.put(key, p.getResource());\r
- }\r
-\r
- for (Entry<String, Resource> e : sorter.entrySet()) {\r
- final String name = e.getKey();\r
- final Resource r = e.getValue();\r
- Action a = new Action() {\r
- Resource res;\r
- public void run() {\r
- parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
-\r
- Instance ins = InstanceFactory.getInstanceOfType(g,r);\r
- Resource instance = ins.instantiate(g);\r
- Shape shape = new Shape(g,instance);\r
- res = shape.getResource();\r
- resetShape(shape);\r
- CSGModel model = new CSGModel(g,parent.getModelResource());\r
- model.addStatement(ShapeEditorResources.g3dResource.HasChild, shape.getResource());\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- @Override\r
- public void handleException(Throwable e) {\r
- super.handleException(e);\r
- ErrorLogger.defaultLogError("Adding " + name + " failed.", e);\r
- }\r
- \r
- @Override\r
- public void requestCompleted(GraphRequestStatus status) {\r
- parent.getRenderingComposite().getDisplay().asyncExec(new Runnable(){\r
- public void run() {\r
- parent.getSelectionAdapter().updateSelection(new StructuredResourceSelection(res));\r
- }\r
- });\r
- }\r
- });\r
- }\r
- };\r
- a.setText(name);\r
- a.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));\r
- addActions.add(a);\r
-\r
- }\r
-\r
- unionAction = new WriteAction(parent,false) {\r
-\r
- Resource r;\r
- @Override\r
- public boolean usable(Graph graph,List<Resource> resources) {\r
- if (resources.size() >= 2)\r
- return true;\r
- return false;\r
- }\r
-\r
- public GraphRequestStatus doChanges(Graph graph) {\r
- List<IGraphicsNode> list = parent.getSelectionAdapter().getSelectedObjects();\r
- if (list.size() < 2) {\r
- showMessage("Union works between two objects");\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- Resource r1 = list.get(0).getResource();\r
- CSGShape shape1 = new CSGShape(graph,r1);\r
-\r
- G3DNode parent = shape1.getParent();\r
- if (parent == null) {\r
- showMessage("Primary shape has no parent, don't know what to do");\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- BooleanOperation op = Union.createDefault(graph).toBooleanOperation(); //FIXME : stubcast\r
- r = op.getResource();\r
- if (createBooleanOp(op, parent, shape1, list))\r
- return GraphRequestStatus.transactionComplete();\r
- else\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- \r
- @Override\r
- public void afterChanges(GraphRequestStatus status) {\r
- parent.getRenderingComposite().getDisplay().asyncExec(new Runnable(){\r
- public void run() {\r
- parent.getSelectionAdapter().updateSelection(new StructuredResourceSelection(r));\r
- }\r
- });\r
- }\r
- };\r
- unionAction.setText("Union");\r
- unionAction.setToolTipText("Union");\r
- unionAction.setImageDescriptor(UNION_IMAGE);\r
-\r
- differenceAction = new WriteAction(parent,false) {\r
-\r
- Resource r;\r
- @Override\r
- public boolean usable(Graph graph,List<Resource> resources) {\r
- if (resources.size() >= 2)\r
- return true;\r
- return false;\r
- }\r
-\r
- public GraphRequestStatus doChanges(Graph graph) {\r
- List<IGraphicsNode> list = parent.getSelectionAdapter().getSelectedObjects();\r
- if (list.size() < 2) {\r
- showMessage("Difference works between two objects");\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- CSGShape shape1 = new CSGShape(graph,list.get(0).getResource());\r
- G3DNode parent = shape1.getParent();\r
- if (parent == null) {\r
- showMessage("Primary shape has no parent, don't know what to do");\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- BooleanOperation op = Difference.createDefault(graph).toBooleanOperation(); //FIXME : stubcast\r
- r = op.getResource();\r
- if (createBooleanOp(op, parent, shape1, list))\r
- return GraphRequestStatus.transactionComplete();\r
- else\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- \r
- @Override\r
- public void afterChanges(GraphRequestStatus status) {\r
- parent.getRenderingComposite().getDisplay().asyncExec(new Runnable(){\r
- public void run() {\r
- parent.getSelectionAdapter().updateSelection(new StructuredResourceSelection(r));\r
- }\r
- });\r
- }\r
- };\r
- differenceAction.setText("Difference");\r
- differenceAction.setToolTipText("Difference");\r
- differenceAction.setImageDescriptor(DIFFERENCE_IMAGE);\r
-\r
- intersectionAction = new WriteAction(parent,false) {\r
- Resource r;\r
- @Override\r
- public boolean usable(Graph graph,List<Resource> resources) {\r
- if (resources.size() >= 2)\r
- return true;\r
- return false;\r
- }\r
-\r
- public GraphRequestStatus doChanges(Graph graph) {\r
- List<IGraphicsNode> list = parent.getSelectionAdapter()\r
- .getSelectedObjects();\r
- if (list.size() < 2) {\r
- showMessage("Intersection works between two objects");\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- CSGShape shape1 = new CSGShape(graph,list.get(0).getResource());\r
- G3DNode parent = shape1.getParent();\r
- if (parent == null) {\r
- showMessage("Primary shape has no parent, don't know what to do");\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- BooleanOperation op = Intersection.createDefault(graph).toBooleanOperation(); //FIXME : stubcast\r
- r = op.getResource();\r
- if (createBooleanOp(op, parent, shape1, list))\r
- return GraphRequestStatus.transactionComplete();\r
- else\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- \r
- @Override\r
- public void afterChanges(GraphRequestStatus status) {\r
- parent.getRenderingComposite().getDisplay().asyncExec(new Runnable(){\r
- public void run() {\r
- parent.getSelectionAdapter().updateSelection(new StructuredResourceSelection(r));\r
- }\r
- });\r
- \r
- }\r
- };\r
- intersectionAction.setText("Intersection");\r
- intersectionAction.setToolTipText("Intersection");\r
- intersectionAction.setImageDescriptor(INTERSECTION_IMAGE);\r
-\r
- splitAction = new WriteAction(parent,false) {\r
-\r
- @Override\r
- public boolean usable(Graph graph,List<Resource> resources) {\r
- if (resources.size() == 1) {\r
- Resource r = resources.iterator().next();\r
- IEntity t = EntityFactory.create(graph,r);\r
- if (t.isInstanceOf(ShapeEditorResources.csgResource.BooleanOperation)) {\r
- return true;\r
- }\r
- }\r
-\r
- return false;\r
- }\r
- \r
- \r
- \r
- public GraphRequestStatus doChanges(Graph graph) {\r
- List<IGraphicsNode> list = parent.getSelectionAdapter().getSelectedObjects();\r
- if (list.size() != 1) {\r
- showMessage("Split requires one object");\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- Resource deletedResource = list.get(0).getResource();\r
- IEntity deletedEntity = EntityFactory.create(graph,deletedResource);\r
- if (!deletedEntity.isInstanceOf(ShapeEditorResources.csgResource.BooleanOperation)) {\r
- showMessage("Split requires boolean operation");\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- Collection<IEntity> parents = deletedEntity.getRelatedObjects(ShapeEditorResources.g3dResource.HasParent);\r
- if (parents.size() != 1) {\r
- showMessage("Shape has " + parents.size()\r
- + " parents, don't know what to do");\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- IEntity parent = parents.iterator().next();\r
- // find all shapes and their positions and orientations relative to world coordinates\r
- BooleanOperation op = new BooleanOperation(deletedEntity);\r
- CSGShape shape1 = op.getMainShape();\r
- Point3d shape1WorldPos = G3DTools.getPoint(shape1.getWorldPosition());\r
- AxisAngle4d shape1WorldRot = G3DTools.getOrientation(shape1.getWorldOrientation());\r
- //System.out.println(shape1WorldPos + " " + shape1WorldRot);\r
- Collection<CSGShape> shape2s = op.getSecondaryShape();\r
-\r
- ArrayList<Point3d> shape2WorldPos = new ArrayList<Point3d>();\r
- ArrayList<AxisAngle4d> shape2WorldRot = new ArrayList<AxisAngle4d>();\r
- for (CSGShape shape : shape2s) {\r
- Point3d pos = G3DTools.getPoint(shape.getWorldPosition());\r
- AxisAngle4d rot = G3DTools.getOrientation(shape.getWorldOrientation());\r
- shape2WorldPos.add(pos);\r
- shape2WorldRot.add(rot);\r
- //System.out.println(pos + " " + rot);\r
- }\r
-\r
- // removed boolean operation is either connected to model or another boolean operation.\r
- CSGModel m = new CSGModel(graph,CSGModellingContribution.this.parent.getModelResource());\r
- if (parent.getResource().equals(CSGModellingContribution.this.parent.getModelResource())) {\r
- // if deleted boolean operation is connected to the model,\r
- // all its children are added to the model\r
-\r
- m.removeStatement(ShapeEditorResources.g3dResource.HasChild, op);\r
- m.addStatement(ShapeEditorResources.g3dResource.HasChild, shape1);\r
- for (CSGShape shape2 : shape2s) {\r
- m.addStatement(ShapeEditorResources.g3dResource.HasChild, shape2);\r
- }\r
-\r
- } else {\r
- // deleted boolean operation is connected to another boolean\r
- // operation\r
- // if the deleted boolean operation is primary child, we'll\r
- // must replace it with deleted boolean operations\r
- // primary child\r
- if (!parent.isInstanceOf(ShapeEditorResources.csgResource.BooleanOperation)) {\r
- ErrorLogger.defaultLogError("Parent shape is not a boolean operation nor model ?!", null);\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- BooleanOperation parentOp = new BooleanOperation(parent);\r
- // we'll have to list all secondary shapes in parent boolean\r
- // op so that we can find the correct relatio\r
- Collection<IEntity> parentShape2s = parentOp.getRelatedObjects(ShapeEditorResources.csgResource.HasSecondaryShape);\r
-\r
- if (parentOp.getMainShape().getResource().equals(deletedResource)) {\r
- // split boolean operation is the primary child in the\r
- // parent boolean operation\r
- parent.removeStatement(ShapeEditorResources.csgResource.HasMainShape,deletedResource);\r
- // graph.commitChanges(ShapeEditorView.this);\r
- parent.addStatement(ShapeEditorResources.csgResource.HasMainShape, shape1);\r
- // graph.commitChanges(ShapeEditorView.this);\r
- for (CSGShape shape2 : shape2s) {\r
- m.addStatement(ShapeEditorResources.g3dResource.HasChild, shape2);\r
- }\r
- } else if (contains(parentShape2s, deletedResource)) {\r
- // split boolean operation is one of the secondary\r
- // shapes in the parent boolean operation\r
- parent.removeStatement(ShapeEditorResources.csgResource.HasSecondaryShape,deletedResource);\r
- // graph.commitChanges(ShapeEditorView.this);\r
- parent.addStatement(ShapeEditorResources.csgResource.HasSecondaryShape,shape1);\r
- // graph.commitChanges(ShapeEditorView.this);\r
-\r
- // model.getConsistOfShapeSet().add(shape2);\r
- for (CSGShape shape2 : shape2s) {\r
- m.addStatement(ShapeEditorResources.g3dResource.HasChild, shape2);\r
- }\r
- } else {\r
- ErrorLogger.defaultLogError("Parent shape is not a boolean operation nor model ?!", null);\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- }\r
- deletedEntity.removeStatement(ShapeEditorResources.csgResource.HasMainShape, shape1);\r
- for (CSGShape shape2 : shape2s)\r
- deletedEntity.removeStatement(ShapeEditorResources.csgResource.HasSecondaryShape, shape2);\r
- //graph.commit();\r
- //System.out.println("Setting original transformations");\r
- //G3DTools.setTuple3(shape1.getWorldPosition(), shape1WorldPos);\r
- //G3DTools.setOrientation(shape1.getWorldOrientation(), shape1WorldRot);\r
- G3DAPI.setWorldTransformation(shape1, shape1WorldPos,shape1WorldRot);\r
- \r
- int i = 0;\r
- for (CSGShape shape : shape2s) {\r
- G3DAPI.setWorldTransformation(shape, shape2WorldPos.get(i),shape2WorldRot.get(i));\r
- //G3DTools.setTuple3(shape.getWorldPosition(), shape2WorldPos.get(i));\r
- //G3DTools.setOrientation(shape.getWorldOrientation(),shape2WorldRot.get(i));\r
- i++;\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
-\r
- }\r
- };\r
- splitAction.setText("Split");\r
- splitAction.setToolTipText("Split");\r
- splitAction.setImageDescriptor(PlatformUI.getWorkbench()\r
- .getSharedImages().getImageDescriptor(\r
- ISharedImages.IMG_OBJS_INFO_TSK));\r
-\r
- linkAction = new WriteAction(parent,false) {\r
- Resource r;\r
- @Override\r
- public boolean usable(Graph graph,List<Resource> resources) {\r
- if (resources.size() == 2) {\r
- Iterator<Resource> i = resources.iterator();\r
- Shape s1 = new Shape(graph,i.next());\r
- Shape s2 = new Shape(graph,i.next());\r
- if (s1.getRelatedObjects(ShapeEditorResources.g3dResource.GeometryDefinitionOf).size() == 0 &&\r
- s2.getRelatedObjects(ShapeEditorResources.g3dResource.GeometryDefinitionOf).size() == 0)\r
- return true;\r
-\r
- }\r
- return false;\r
- }\r
-\r
- public GraphRequestStatus doChanges(Graph graph) {\r
- List<IGraphicsNode> list = parent.getSelectionAdapter().getSelectedObjects();\r
- if (list.size() != 2) {\r
- showMessage("Link works between two objects");\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- Resource r1 = list.get(0).getResource();\r
- Resource r2 = list.get(1).getResource();\r
-\r
- CSGShape shape1 = new CSGShape(graph,r1);\r
- CSGShape shape2 = new CSGShape(graph,r2);\r
- \r
- Point3d p = G3DTools.getPoint(shape2.getWorldPosition());\r
- AxisAngle4d aa = G3DTools.getOrientation(shape2.getWorldOrientation());\r
- //System.out.println(p + " " + aa);\r
- shape2.removeRelatedStatements(ShapeEditorResources.g3dResource.HasParent);\r
- r = shape2.getResource();\r
- //System.out.println("Link remove commit");\r
- //graph.commitChanges(ShapeEditorView.this);\r
- //shape1.getChild().add(shape2.toG3DNode()); //FIXME : stubcast\r
- shape1.addStatement(ShapeEditorResources.g3dResource.HasChild, shape2);\r
- // FIXME : this is needed\r
- //System.out.println("Link add commit");\r
- //graph.commitChanges(ShapeEditorView.this);\r
- //G3DTools.setTuple3(shape2.getWorldPosition(), p);\r
- //G3DTools.setOrientation(shape2.getWorldOrientation(), aa);\r
- G3DAPI.setWorldTransformation(shape2, p, aa);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- @Override\r
- public void afterChanges(GraphRequestStatus status) {\r
- parent.getRenderingComposite().getDisplay().asyncExec(new Runnable(){\r
- public void run() {\r
- parent.getSelectionAdapter().updateSelection(new StructuredResourceSelection(r));\r
- }\r
- });\r
- }\r
- };\r
- linkAction.setText("Link");\r
- linkAction.setToolTipText("Link");\r
- linkAction.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/link.png"));\r
-\r
- unlinkAction = new WriteAction(parent,false) {\r
- Resource r;\r
- @Override\r
- public boolean usable(Graph graph,List<Resource> resources) {\r
- if (resources.size() == 1) {\r
- Iterator<Resource> i = resources.iterator();\r
- Shape s1 = new Shape(graph,i.next());\r
- return (s1.getRelatedObjects(ShapeEditorResources.g3dResource.GeometryDefinitionOf).size() == 0\r
- && s1.getParent() != null && !s1.getParent()\r
- .getResource().equals(CSGModellingContribution.this.parent.getModelResource()));\r
-\r
- }\r
- return false;\r
- }\r
-\r
- public GraphRequestStatus doChanges(Graph graph) {\r
- List<IGraphicsNode> list = parent.getSelectionAdapter().getSelectedObjects();\r
- if (list.size() != 1) {\r
- showMessage("Unlink works with one object");\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- Resource r1 = list.get(0).getResource();\r
-\r
- CSGShape shape1 = new CSGShape(graph,r1);\r
- CSGModel m = new CSGModel(graph,CSGModellingContribution.this.parent.getModelResource());\r
- Point3d p = G3DTools.getPoint(shape1.getWorldPosition());\r
- AxisAngle4d aa = G3DTools.getOrientation(shape1.getWorldOrientation());\r
- shape1.removeRelatedStatements(ShapeEditorResources.g3dResource.HasParent);\r
- //graph.commitChanges(ShapeEditorView.this);\r
- m.addStatement(ShapeEditorResources.g3dResource.HasChild, shape1);\r
- // FIXME : this is needed\r
- //graph.commitChanges(ShapeEditorView.this);\r
- //G3DTools.setTuple3(shape1.getWorldPosition(), p);\r
- //G3DTools.setOrientation(shape1.getWorldOrientation(), aa);\r
- G3DAPI.setWorldTransformation(shape1, p, aa);\r
- r = shape1.getResource();\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- @Override\r
- public void afterChanges(GraphRequestStatus status) {\r
- parent.getRenderingComposite().getDisplay().asyncExec(new Runnable(){\r
- public void run() {\r
- parent.getSelectionAdapter().updateSelection(new StructuredResourceSelection(r));\r
- }\r
- });\r
- }\r
- };\r
- unlinkAction.setText("Unlink");\r
- unlinkAction.setToolTipText("Unlink");\r
- unlinkAction.setImageDescriptor(Activator.imageDescriptorFromPlugin(\r
- Activator.PLUGIN_ID, "icons/unlink.png"));\r
-\r
- actions.add(unionAction);\r
- actions.add(intersectionAction);\r
- actions.add(differenceAction);\r
- actions.add(splitAction);\r
- actions.add(linkAction);\r
- actions.add(unlinkAction);\r
- }\r
- \r
- boolean contains(ArrayList<Resource> parentShape2sIds, Resource id) {\r
- for (int i = 0; i < parentShape2sIds.size(); i++) {\r
- if (parentShape2sIds.get(i).equals(id))\r
- return true;\r
-\r
- }\r
- return false;\r
- }\r
- \r
- boolean contains(Collection<IEntity> parentShape2sIds, Resource id) {\r
- for (IEntity e : parentShape2sIds) {\r
- if (e.getResource().equals(id))\r
- return true;\r
-\r
- }\r
- return false;\r
- }\r
-\r
- private boolean createBooleanOp(BooleanOperation op, G3DNode parent,\r
- CSGShape shape1, List<IGraphicsNode> list) {\r
-\r
- resetShape(op.toShape()); //FIXME : stubcast\r
- // new boolean operation is added to the first shape's parent\r
- // the parent is the model\r
-\r
- Point3d refPos = G3DTools.getPoint(shape1.getLocalPosition());\r
- G3DTools.setTuple3(op.getLocalPosition(), refPos);\r
- refPos.negate();\r
- G3DTools.addTuple3(shape1.getLocalPosition(), refPos);\r
- op.removeRelatedStatements(ShapeEditorResources.csgResource.HasMainShape);\r
- op.addStatement(ShapeEditorResources.csgResource.HasMainShape, shape1);\r
- \r
- if (!replaceShape(parent, shape1.toShape(), op.toShape())) { //FIXME : stubcast\r
- return false;\r
- }\r
- //model.getConsistOfSet().remove(shape1);\r
- for (int i = 1; i < list.size(); i++) {\r
- CSGShape shape2 = new CSGShape(op.getGraph(),list.get(i).getResource());\r
- G3DTools.addTuple3(shape2.getLocalPosition(), refPos);\r
- G3DNode shape2parent = shape2.getParent();\r
- if (shape2parent != null) {\r
- // we'll must link before removing or shape will be deleted\r
- //op.addStatement(ShapeEditorResources.csgResource.HasSecondaryShape,shape2); \r
- //if (!replaceShape(shape2parent, shape2, null)) {\r
- // op.removeStatement(ShapeEditorResources.csgResource.HasSecondaryShape, shape2);\r
- // // shape couldn't be removed so we'll remove the link\r
- //}\r
- \r
- if (replaceShape(shape2parent, shape2.toShape(), null)) { //FIXME : stubcast\r
- op.addStatement(ShapeEditorResources.csgResource.HasSecondaryShape,shape2);\r
- }\r
- }\r
- }\r
- // Commit is not needed because this is final call in all transactions\r
- //graph.commitChanges(ShapeEditorView.this);\r
- return true;\r
- }\r
-\r
- /**\r
- * Replaces or removes parent from shape\r
- * @param parent parent containing shape\r
- * @param removed the shape\r
- * @param added the replacing shape or null\r
- * @return true if replacing or removing was successful\r
- * @throws TransactionException\r
- */\r
- private boolean replaceShape(G3DNode parent, Shape removed, Shape added) {\r
- assert (parent != null);\r
- assert (removed != null);\r
-\r
- \r
- //CSGModel m = CSGModelFactory.create(parent.getGraph(),model);\r
- if (parent.getResource().equals(this.parent.getModelResource())) {\r
- // parent is model (rootnode). \r
- // shape is connected to it with "Has Child" relation\r
- parent.removeStatement(ShapeEditorResources.g3dResource.HasChild, removed);\r
- if (added != null) {\r
- parent.addStatement(ShapeEditorResources.g3dResource.HasChild, added);\r
- }\r
- } else {\r
- // the first shape's parent is boolean operation\r
- // so we must know if its connected as a primary shape or as a secondary shape\r
- if (!parent.isInstanceOf(ShapeEditorResources.csgResource.BooleanOperation)) {\r
- ErrorLogger.defaultLogError("Parent shape is not a boolean operation nor model ?!",null);\r
- return false;\r
- }\r
- BooleanOperation parentOp = new BooleanOperation(parent);\r
- // listing all secondary shapes in the parent boolean operation\r
- Collection<CSGShape> parentShape2s = parentOp.getSecondaryShape();\r
- ArrayList<Resource> parentShape2sIds = new ArrayList<Resource>();\r
- for (CSGShape shape2 : parentShape2s)\r
- parentShape2sIds.add(shape2.getResource());\r
- if (parentOp.getMainShape().getResource().equals(removed.getResource())) {\r
- if (added == null) {\r
- return false;\r
- }\r
- parent.removeStatement(ShapeEditorResources.csgResource.HasMainShape, removed);\r
- parent.addStatement(ShapeEditorResources.csgResource.HasMainShape, added);\r
- \r
- } else if (contains(parentShape2sIds, removed.getResource())) {\r
-\r
- parent.removeStatement(ShapeEditorResources.csgResource.HasSecondaryShape, removed);\r
- parent.addStatement(ShapeEditorResources.csgResource.HasSecondaryShape, added); \r
- \r
- } else {\r
- ErrorLogger.defaultLogError("Parent shape is not a boolean operation nor model ?!",null);\r
- //coreTC.cancelTransaction();\r
- return false;\r
- }\r
- }\r
- return true;\r
- }\r
-\r
- /**\r
- * Resets shape to identity rotation and zero translation\r
- * \r
- * @param shape\r
- */\r
- private void resetShape(Shape shape) {\r
- G3DTools.resetTransformation(shape);\r
- Graph graph = shape.getGraph();\r
- if (shape.isInstanceOf(ShapeEditorResources.csgResource.Primitive)) {\r
- Primitive prim = new Primitive(shape);\r
- Collection<Property> c = prim.getSizingProperty();\r
- if (c.size() == 0)\r
- ErrorLogger.getDefault().logWarning("Shape does not contain sizing properties.", null);\r
- \r
- for (Property p : c) {\r
- if (p.isInstanceOf(graph.getBuiltins().Double)) {\r
- graph.setScalarDouble(p.getResource(), 1.0);\r
- } else if (p.isInstanceOf(graph.getBuiltins().Integer)) {\r
- graph.setScalarInteger(p.getResource(), 1);\r
- } else {\r
- ErrorLogger.getDefault().logWarning("Cannot handle sizing property " + p.getName() , null);\r
- }\r
- }\r
- }\r
- \r
- }\r
- \r
- protected void showMessage(String s) {\r
- parent.showMessage(s);\r
- }\r
- \r
- @Override\r
- public Collection<ContextAction> getActions() {\r
- return actions;\r
- }\r
- \r
- \r
- @Override\r
- public void fillLocalToolBar(IToolBarManager manager) {\r
-\r
- }\r
- \r
- @Override\r
- public void fillLocalPullDown(IMenuManager manager) {\r
- \r
- }\r
- \r
- @Override\r
- public void dispose() {\r
- \r
- }\r
- \r
- @Override\r
- public void run() {\r
-\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.tools;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.List;\r
-\r
-import org.eclipse.jface.action.IMenuManager;\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.eclipse.jface.dialogs.InputDialog;\r
-import org.eclipse.jface.dialogs.MessageDialog;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.SelectionAdapter;\r
-import org.eclipse.swt.events.SelectionEvent;\r
-import org.eclipse.swt.graphics.Rectangle;\r
-import org.eclipse.swt.layout.FillLayout;\r
-import org.eclipse.swt.layout.FormAttachment;\r
-import org.eclipse.swt.layout.FormData;\r
-import org.eclipse.swt.layout.FormLayout;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.layout.GridLayout;\r
-import org.eclipse.swt.widgets.Button;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Event;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.Listener;\r
-import org.eclipse.swt.widgets.Sash;\r
-import org.eclipse.swt.widgets.Tree;\r
-import org.eclipse.ui.forms.IFormColors;\r
-import org.eclipse.ui.forms.events.ExpansionAdapter;\r
-import org.eclipse.ui.forms.events.ExpansionEvent;\r
-import org.eclipse.ui.forms.widgets.FormToolkit;\r
-import org.eclipse.ui.forms.widgets.ScrolledForm;\r
-import org.eclipse.ui.forms.widgets.Section;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.equation.stubs.SecondOrderScalarPolynomial;\r
-import org.simantics.animation.stubs.Animation;\r
-import org.simantics.animation.stubs.Interpolator;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.ResourceDebugUtils;\r
-import org.simantics.proconf.browsing.GraphExplorer;\r
-import org.simantics.proconf.browsing.GraphExplorerInputFactory;\r
-import org.simantics.proconf.browsing.views.PropertyTable;\r
-import org.simantics.proconf.g3d.actions.ContextAction;\r
-import org.simantics.proconf.g3d.base.EditorContribution;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-import org.simantics.proconf.g3d.shapeeditor.ShapeEditorResources;\r
-import org.simantics.proconf.g3d.shapeeditor.common.ViewpointGenerator;\r
-import org.simantics.proconf.g3d.shapeeditor.views.ShapeEditorBase;\r
-import org.simantics.proconf.g3d.stubs.G3DModel;\r
-import org.simantics.proconf.g3d.tools.OESelectionListener;\r
-import org.simantics.proconf.g3d.tools.PropertyTree;\r
-import org.simantics.utils.ui.jface.BaseSelectionProvider;\r
-\r
-\r
-public class ParameterizationContribution implements EditorContribution {\r
-\r
- private ShapeEditorBase parent;\r
- private List<ContextAction> actions = new ArrayList<ContextAction>();\r
- private Composite sideComposite;\r
- private Sash sash;\r
- \r
- \r
- public ParameterizationContribution(ThreeDimensionalEditorBase parent) {\r
- this.parent = (ShapeEditorBase) parent;\r
- }\r
- \r
- @Override\r
- public void createControl(final Composite parentComposite) {\r
- FormLayout flayout = new FormLayout();\r
- parentComposite.setLayout(flayout);\r
- sash = new Sash(parentComposite,SWT.VERTICAL);\r
- \r
- sideComposite = new Composite(parentComposite,SWT.BORDER);\r
- FormData data = new FormData();\r
- data.top = new FormAttachment(0, 0);\r
- data.left = new FormAttachment(0, 0);\r
- data.right = new FormAttachment(sash, 0, SWT.LEFT);\r
- data.bottom = new FormAttachment(100,0);\r
- this.parent.getRenderingComposite().setLayoutData(data);\r
- sideComposite.setLayout(new FillLayout(SWT.VERTICAL));\r
- data = new FormData();\r
- data.top = new FormAttachment(0, 0);\r
- data.bottom = new FormAttachment(100,0);\r
- data.right = new FormAttachment(100,0);\r
- data.left = new FormAttachment(sash,0,SWT.RIGHT);\r
- sideComposite.setLayoutData(data);\r
- \r
- final int limit = 20, percent = 50;\r
- final FormData sashData = new FormData();\r
- sashData.left = new FormAttachment (percent, 0);\r
- sashData.top = new FormAttachment(0, 0);\r
- sashData.bottom = new FormAttachment(100,0);\r
- \r
- sash.setLayoutData (sashData);\r
- sash.addListener (SWT.Selection, new Listener () {\r
- public void handleEvent (Event e) {\r
- Rectangle sashRect = sash.getBounds ();\r
- Rectangle shellRect = parentComposite.getClientArea ();\r
- int right = shellRect.width - sashRect.width - limit;\r
- e.x = Math.max (Math.min (e.x, right), limit);\r
- if (e.x != sashRect.x) {\r
- sashData.left = new FormAttachment (0, e.x);\r
- parentComposite.layout ();\r
- }\r
- }\r
- });\r
- createForm(sideComposite);\r
- \r
- hierarchyExplorer.setInput(parent.getSessionContext(),GraphExplorerInputFactory.clone(hierarchyExplorer.getInput())\r
- .input(parent.getModelResource())\r
- .viewpoint(ViewpointGenerator.createObjectStructureViewpoint())\r
- .toInput());\r
-\r
-// parameterExplorer.setInput(parent.getSessionContext(),GraphExplorerInputFactory.clone(parameterExplorer.getInput())\r
-// .input(parent.getModelResource())\r
-// .viewpoint(ViewpointGenerator.createObjectSizingParameterViewpoint(ShapeEditorResources.g3dResource.HasSizingParameter))\r
-// .toInput());\r
- parameterTable.setSession(parent.getSession());\r
- parameterTable.setInput(new StructuredResourceSelection(parent.getModelResource()));\r
- \r
- }\r
- \r
- @Override\r
- public void disposeControl() {\r
- sideComposite.dispose();\r
- sash.dispose();\r
- \r
- }\r
- \r
- @Override\r
- public void dispose() {\r
-\r
- }\r
- \r
- @Override\r
- public void fillContextMenu(Graph graph, IMenuManager manager,\r
- StructuredResourceSelection selection) {\r
-\r
- }\r
- \r
- @Override\r
- public void fillLocalPullDown(IMenuManager manager) {\r
-\r
- }\r
- \r
- @Override\r
- public void fillLocalToolBar(IToolBarManager manager) {\r
-\r
- }\r
- \r
- @Override\r
- public Collection<ContextAction> getActions() {\r
- return actions;\r
- }\r
- \r
- @Override\r
- public String getName() {\r
- return "Parameterization";\r
- }\r
- \r
- @Override\r
- public void initialize(Graph graph) {\r
-\r
- }\r
- \r
- @Override\r
- public void run() {\r
- \r
- }\r
- \r
- private ScrolledForm form;\r
- private BaseSelectionProvider defaultInputSelectionProvider = new BaseSelectionProvider();\r
- protected FormToolkit toolkit;\r
- \r
-\r
- \r
- private void createForm(Composite parent) {\r
- toolkit = new FormToolkit(parent.getDisplay());\r
- form = getToolkit().createScrolledForm(parent);\r
-\r
- GridLayout layout = new GridLayout(2, false);\r
- form.getBody().setLayout(layout);\r
- form.getBody().setLayoutData(\r
- new GridData(GridData.FILL, GridData.FILL, true, true));\r
-\r
- // By default make this ViewPart use a default ISelectionProvider\r
- // that will offer the viewparts input resource as its selection.\r
- // The Resource is wrapped into a ResourceSelection object.\r
- // Any widgets created in createWidgets may override the default\r
- // selection provider.\r
- //getEditorSite().setSelectionProvider(defaultInputSelectionProvider);\r
-\r
- beforeCreateWidgets();\r
- createWidgets();\r
-\r
- //reload();\r
-\r
- form.setText(getFormText());\r
-\r
- // Finally Set the default selection which will have an effect only\r
- // if nothing in createWidgets has overridden the default selection\r
- // provider.\r
-// ISelection s = ISelectionUtils\r
-// .createSelection(new StructuredResourceSelection(\r
-// getInputResource()));\r
-// defaultInputSelectionProvider.setSelection(s);\r
- }\r
- \r
- \r
- public ScrolledForm getActiveForm() {\r
- return form;\r
- }\r
-\r
- protected Composite getBody() {\r
- return form.getBody();\r
- }\r
- \r
- public Composite newGridSection(int formColumns, int childColumns,\r
- boolean equalWidth, boolean grabVertical, String text,\r
- String description) {\r
- return newGridSection(getBody(), formColumns, childColumns, equalWidth,\r
- grabVertical, text, description);\r
- }\r
-\r
- public Composite newGridSection(Composite parent, int formColumns,\r
- int childColumns, boolean equalWidth, boolean grabVertical,\r
- String text, String description) {\r
- FormToolkit toolkit = getToolkit();\r
-\r
- Section section = toolkit.createSection(parent, Section.DESCRIPTION\r
- | Section.TWISTIE | Section.TITLE_BAR | Section.EXPANDED);\r
- section.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true,\r
- grabVertical, formColumns, 1));\r
- section.addExpansionListener(new ExpansionAdapter() {\r
- public void expansionStateChanged(ExpansionEvent e) {\r
- //System.out.println("SinglePageTypeEditor: expansionStateChanged " + e);\r
- //reflow(true);\r
- }\r
- });\r
- section.setText(text);\r
- section.setDescription(description);\r
- Composite sectionClient = toolkit.createComposite(section);\r
- sectionClient.setLayout(new GridLayout(childColumns, equalWidth));\r
- sectionClient.setLayoutData(new GridData());\r
- section.setClient(sectionClient);\r
- return sectionClient;\r
- }\r
- \r
- public FormToolkit getToolkit() {\r
- return toolkit;\r
- }\r
- \r
- public void reflow(boolean flushCache) {\r
- //System.out.println("FormTypeEditorBase.reflow(" + flushCache + ")");\r
- getActiveForm().reflow(flushCache);\r
- }\r
- \r
- protected void beforeCreateWidgets() {\r
- }\r
- \r
-// private TrackedText modelName = null;\r
- StructuredResourceSelection hierarchySelection = new StructuredResourceSelection();\r
- StructuredResourceSelection parameterSelection = new StructuredResourceSelection();\r
- //GraphExplorer parameterExplorer;\r
- PropertyTable parameterTable;\r
- GraphExplorer hierarchyExplorer;\r
- Button deleteParameterButton;\r
- Button clearButton;\r
- PropertyTree propertiesTree;\r
- Button generateButton;\r
- Button askButton;\r
- Button overrideButton;\r
- \r
- protected String getFormText() {\r
- return "Parameterization Editor";\r
- }\r
-\r
- protected void createWidgets() {\r
- createModelPropertiesGroup(newGridSection(2, 1, false, false, "Model Properties",\r
- "Basic properties for this viewpoint"));\r
- createParametrizationGroup(newGridSection(2, 1, false, false, "Parameterization",\r
- "Create parameterization for selected shapes"));\r
- //getSite().setSelectionProvider(this);\r
- }\r
- \r
- private void createParametrizationGroup(Composite parent) {\r
- toolkit.paintBordersFor(parent);\r
- toolkit.setBorderStyle(SWT.BORDER);\r
- \r
- overrideButton = toolkit.createButton(parent, "Overwrite previous parameterizations", SWT.CHECK);\r
- overrideButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- askButton.setEnabled(overrideButton.getSelection());\r
- \r
- }\r
- });\r
-\r
- \r
- askButton = toolkit.createButton(parent, "Ask before overwriting", SWT.CHECK);\r
- askButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- \r
- \r
- }\r
- });\r
- askButton.setEnabled(false);\r
- \r
- generateButton = toolkit.createButton(parent, "Generate linear parameterization", SWT.PUSH);\r
- generateButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- generateMappings();\r
- \r
- }\r
- });\r
- generateButton.setEnabled(false);\r
- \r
- \r
- }\r
- \r
- private void createModelPropertiesGroup(final Composite parent) {\r
- \r
- toolkit.paintBordersFor(parent);\r
- toolkit.setBorderStyle(SWT.BORDER);\r
- \r
- GridData gridData1 = new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1);\r
- \r
- \r
- // Parameters\r
- Label parameterLabel = toolkit.createLabel(parent, "Parameters:");\r
- parameterLabel.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));\r
- parameterLabel.setLayoutData(gridData1);\r
- \r
-// parameterExplorer = new GraphExplorer(parent, SWT.SINGLE); //new OntologyExplorer("ParameterExplorer", this, getInput("ParameterExplorer", model.getId()));\r
-// parameterExplorer.getViewer().addPostSelectionChangedListener(new OESelectionListener() {\r
-//\r
-// protected void resourceSelectionUpdated(StructuredResourceSelection sel) {\r
-// parameterSelection = sel;\r
-// if (parameterSelection.size() == 0) {\r
-// deleteParameterButton.setEnabled(false);\r
-// clearButton.setEnabled(false);\r
-// } else {\r
-// deleteParameterButton.setEnabled(true);\r
-// clearButton.setEnabled(true);\r
-// }\r
-// updateGenerateButtonStatus();\r
-// }\r
-// \r
-// });\r
-// Tree oe = parameterExplorer.getTree();\r
-// toolkit.adapt(oe, true, true);\r
- \r
- parameterTable = new PropertyTable(parent,SWT.NONE);\r
- parameterTable.getViewer().addPostSelectionChangedListener(new OESelectionListener() {\r
-\r
- protected void resourceSelectionUpdated(StructuredResourceSelection sel) {\r
- parameterSelection = sel;\r
- if (parameterSelection.size() == 0) {\r
- deleteParameterButton.setEnabled(false);\r
- clearButton.setEnabled(false);\r
- } else {\r
- deleteParameterButton.setEnabled(true);\r
- clearButton.setEnabled(true);\r
- }\r
- updateGenerateButtonStatus();\r
- }\r
- \r
- });\r
- \r
- GridData gd3 = new GridData(GridData.FILL, GridData.FILL, true, true,1,1);\r
- gd3.heightHint = 50;\r
- //oe.setLayoutData(gd3);\r
-\r
- parameterTable.setLayoutData(gd3);\r
- \r
- // Buttons to add and remove parameters\r
- toolkit.createLabel(parent, "");\r
- Composite buttons = toolkit.createComposite(parent);\r
-\r
- buttons.setLayout(new FillLayout(SWT.HORIZONTAL));\r
- Button newParameterButton = toolkit.createButton(buttons, "New Parameter", SWT.PUSH);\r
- newParameterButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- InputDialog dialog = new InputDialog(ParameterizationContribution.this.parent.getRenderingComposite().getShell(),"New Parameter","Enter parameter's name","new parameter",null);\r
- if (dialog.open() == InputDialog.CANCEL)\r
- return;\r
- final String name = dialog.getValue();\r
- if (name.length() < 1) \r
- return; // TODO : show error\r
- \r
- ParameterizationContribution.this.parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- //fi.vtt.simantics.layer0.stubs.Double parameter = DoubleFactory.createDefault(g);\r
- //getModel(g).addStatement(ShapeEditorResources.g3dResource.HasSizingParameter, parameter);\r
- //parameter.setValue(new double[]{1.0});\r
- //parameter.setName(name);\r
- Resource parameter = ParameterizationContribution.this.parent.getModel(g).addRelatedScalarDouble(ShapeEditorResources.g3dResource.HasSizingParameter, 1.0).getResource();\r
- IEntity thing = EntityFactory.create(g,parameter);\r
- thing.setName(name);\r
- return GraphRequestStatus.transactionComplete();\r
- };\r
- });\r
- \r
- \r
- }\r
- });\r
- deleteParameterButton = toolkit.createButton(buttons, "Delete Parameter", SWT.PUSH);\r
- deleteParameterButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- //StructuredResourceSelection s = (StructuredResourceSelection)parameterScheme.getSelection();\r
- final StructuredResourceSelection s = parameterSelection;\r
- if (s.size() != 1)\r
- return;\r
- // we'll have to start write transaction, since we may have to change the graph\r
- ParameterizationContribution.this.parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
- boolean proceed;\r
- IEntity selectedParameter;\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- selectedParameter = EntityFactory.create(g,s.getSelectionList().get(0));\r
- \r
- Collection<IEntity> parameters = selectedParameter.getRelatedObjects(ShapeEditorResources.g3dResource.HasSizingParameter);\r
- if (parameters.size() > 0) {\r
- final MessageDialog dialog = new MessageDialog(ParameterizationContribution.this.parent.getRenderingComposite().getShell(),"Deleting a parameter",null,"Parameter is in use, doe you wan't to remove it?",MessageDialog.QUESTION,new String[]{"OK","Cancel"},1);\r
- parent.getDisplay().syncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- proceed = (dialog.open() != 1);\r
- }\r
- });\r
- if (proceed) {\r
- ParameterizationContribution.this.parent.getModel(g).removeStatement(ShapeEditorResources.g3dResource.HasSizingParameter,selectedParameter);\r
- }\r
- }\r
- \r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- }\r
- });\r
- deleteParameterButton.setEnabled(false);\r
- \r
- clearButton = toolkit.createButton(buttons, "Clear Parameter", SWT.PUSH);\r
- clearButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- final StructuredResourceSelection s = parameterSelection;\r
- if (s.size() != 1)\r
- return;\r
- ParameterizationContribution.this.parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
- boolean proceed;\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- IEntity selectedParameter = EntityFactory.create(g,s.getSelectionList().get(0));\r
- Collection<IEntity> equations = selectedParameter.getRelatedObjects(ShapeEditorResources.equationResource.HasTarget);\r
- final String name = selectedParameter.getName();\r
- if (equations.size() > 0) {\r
- final MessageDialog dialog = new MessageDialog(ParameterizationContribution.this.parent.getRenderingComposite().getShell(),"Clearing a parameter",null,"Do you wan't to clear parameterization for "+ name + " ?\nIt has " + equations.size() + " mappings.",MessageDialog.QUESTION,new String[]{"OK","Cancel"},1); \r
- parent.getDisplay().syncExec(new Runnable() {\r
- public void run() {\r
- proceed = (dialog.open() != 1);\r
- };\r
- });\r
- if (proceed) {\r
- for (IEntity eq : equations) {\r
- eq.removeRelatedStatements(ShapeEditorResources.equationResource.HasSource);\r
- eq.removeRelatedStatements(ShapeEditorResources.equationResource.HasTarget);\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- }\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- });\r
- \r
- \r
- }\r
- });\r
- clearButton.setEnabled(false);\r
- \r
- Label hierarchyLabel = toolkit.createLabel(parent, "Model Hierarchy:");\r
- hierarchyLabel.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));\r
- hierarchyLabel.setLayoutData(gridData1);\r
- \r
- hierarchyExplorer = new GraphExplorer(parent,SWT.MULTI); //new OntologyExplorer("HierarchyExplorer", this, getInput("HierarchyExplorer", model.getId()));\r
- Tree oeh = hierarchyExplorer.getTree();//hierarchyExplorer.getControl(parent, 1, OntologyExplorer.OntologyTree, SWT.MULTI);\r
- toolkit.adapt(oeh, true, true);\r
- \r
- GridData gd4 = new GridData(GridData.FILL, GridData.FILL, true, true,1,1);\r
- gd4.heightHint = 200;\r
- oeh.setLayoutData(gd4);\r
- hierarchyExplorer.getViewer().addPostSelectionChangedListener(new OESelectionListener() {\r
-\r
- protected void resourceSelectionUpdated(StructuredResourceSelection sel) {\r
- hierarchySelection = sel;\r
- updatePropertiesTable();\r
- updateGenerateButtonStatus();\r
- }\r
- \r
- private void updatePropertiesTable() {\r
- propertiesTree.setProperties(hierarchySelection);\r
- \r
- }\r
- \r
- });\r
-\r
- Label propertiesLabel = toolkit.createLabel(parent, "Available properties:");\r
- propertiesLabel.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));\r
- propertiesLabel.setLayoutData(gridData1); \r
- \r
- //propertiesTable = toolkit.createTable(parent, SWT.MULTI);\r
- Tree tree = toolkit.createTree(parent, SWT.MULTI);\r
- propertiesTree = new PropertyTree(tree,ParameterizationContribution.this.parent.getSession());\r
- //\r
- GridData gd5 = new GridData(GridData.FILL, GridData.FILL, true, true,1,1);\r
- gd5.heightHint = 200;\r
- //propertiesTable.setLayoutData(gd5);\r
- tree.setLayoutData(gd5);\r
- tree.addSelectionListener(new SelectionAdapter() {\r
-\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- updateGenerateButtonStatus();\r
- }\r
- \r
- });\r
-\r
- \r
- }\r
- \r
- private void updateGenerateButtonStatus() {\r
- if (parameterSelection.size() == 0) {\r
- generateButton.setEnabled(false);\r
- return;\r
- }\r
- if (hierarchySelection.size() == 0) {\r
- generateButton.setEnabled(false);\r
- return;\r
- }\r
- if (propertiesTree.getTree().getSelection().length == 0) {\r
- generateButton.setEnabled(false);\r
- return;\r
- }\r
- generateButton.setEnabled(true);\r
- }\r
- \r
- List<Resource> res;\r
- \r
- private void generateMappings() {\r
- final StructuredResourceSelection selectedShapes = hierarchySelection;\r
- final StructuredResourceSelection selectedParameter = parameterSelection;\r
- \r
- final boolean override = overrideButton.getSelection();\r
- final boolean ask = askButton.getSelection();\r
- //TreeItem[] selectedProperties = propertiesTree.getTree().getSelection();\r
- \r
- assert (selectedParameter.size() == 1);\r
- assert (selectedShapes.size() > 0);\r
- //assert(selectedProperties.length > 0);\r
- parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- //fi.vtt.simantics.layer0.stubs.Double parameter = DoubleFactory.create(g,selectedParameter.getSelectionList().get(0));\r
- IEntity parameter = EntityFactory.create(g,selectedParameter.getSelectionList().get(0));\r
- Collection<IEntity> prop = parameter.getRelatedObjects(ShapeEditorResources.g3dResource.HasDefaultDoubleValue);\r
- //fi.vtt.simantics.layer0.stubs.Double defaultValue;\r
- double value = g.getScalarDouble(parameter.getResource());\r
- if (prop.size() == 0) {\r
- //defaultValue = DoubleFactory.createDefault(g);\r
- //parameter.addStatement(ShapeEditorResources.g3dResource.HasDefaultDoubleValue, defaultValue);\r
- parameter.addRelatedScalarDouble(ShapeEditorResources.g3dResource.HasDefaultDoubleValue, value);\r
- } else {\r
- //defaultValue = DoubleFactory.create(prop.iterator().next());\r
- g.setScalarDouble(prop.iterator().next().getResource(),value);\r
- }\r
- //defaultValue.setValue(parameter.getValue());\r
- final Graph graph = g;\r
- parent.getRenderingComposite().getDisplay().syncExec(new Runnable() {\r
- public void run() {\r
- res = propertiesTree.findLeafPropertyInstances(graph, selectedShapes.getSelectionList());\r
- };\r
- });\r
- \r
- \r
- double refValue = parameter.toProperty().getScalarDouble();\r
- ArrayList<Resource> mappedProperties = new ArrayList<Resource>();\r
- \r
- for (Resource r : res) {\r
- IEntity propertyThing = EntityFactory.create(g,r);\r
- assert (propertyThing.isInstanceOf(g.getBuiltins().Double));\r
- final String name = ResourceDebugUtils.getReadableNameForEntity(propertyThing);\r
- double rb = propertyThing.toProperty().getScalarDouble();\r
- System.out.println("Mapping to " + name + " " + rb);\r
- Collection<IEntity> equations = propertyThing.getRelatedObjects(ShapeEditorResources.equationResource.HasSource);\r
- if (equations.size() != 0) {\r
- mappedProperties.add(propertyThing.getResource());\r
- if (override) {\r
- System.out.println("Override");\r
- boolean over = true;\r
- if (ask) {\r
- IEntity t = propertyThing;\r
- while (t.isInstanceOf(g.getBuiltins().Property)) {\r
- Collection<IEntity> ts = t.getRelatedObjects(g.getBuiltins().PropertyOf);\r
- // FIXME : traverse all possible routes\r
- t = ts.iterator().next();\r
- }\r
- //StructuredResourceSelection selection = new StructuredResourceSelection(t.getResource());\r
- // TODO : do the selection!\r
- //hierarchyScheme.setSelection(selection);\r
- //fireSelectionChanged();\r
- MessageDialog dialog = new MessageDialog(ParameterizationContribution.this.parent.getRenderingComposite().getShell(),\r
- "Override mapping",\r
- null,\r
- "Override mapping to property of highlighted shape?",\r
- MessageDialog.QUESTION, new String[] {\r
- "Yes","No", "Cancel" }, 0);\r
- int i = dialog.open();\r
- if (i == 2)\r
- return GraphRequestStatus.transactionCancel();\r
- over = (i == 0);\r
- }\r
- if (over) {\r
- \r
- }\r
- } else {\r
- if (equations.size() != 1) {\r
- throw new RuntimeException("One property can have only one euquation as source function.");\r
- }\r
- IEntity equation = equations.iterator().next();\r
- if (!equation.isInstanceOf(ShapeEditorResources.equationResource.SecondOrderScalarPolynomial)) {\r
- throw new RuntimeException("Only Second order scalar polynomials are supported");\r
- }\r
- SecondOrderScalarPolynomial s = new SecondOrderScalarPolynomial(equation);\r
- s.setA(new double[]{0.0});\r
- s.setB(new double[]{rb / refValue});\r
- s.setC(new double[]{0.0});\r
- \r
- }\r
- } else { //override\r
- // create relation\r
- SecondOrderScalarPolynomial s = SecondOrderScalarPolynomial.createDefault(g);\r
- s.setA(new double[]{0.0});\r
- s.setB(new double[]{rb / refValue});\r
- s.setC(new double[]{0.0});\r
- \r
- // these relations have been instantiated, but addStatements won't delete them so we have to delete them manually.\r
- s.removeRelatedStatements(ShapeEditorResources.equationResource.HasTarget);\r
- s.removeRelatedStatements(ShapeEditorResources.equationResource.HasSource);\r
- \r
- parameter.addStatement(ShapeEditorResources.equationResource.HasTarget, s);\r
- \r
- s.addStatement(ShapeEditorResources.equationResource.HasTarget, propertyThing);\r
- mappedProperties.add(propertyThing.getResource());\r
- }\r
- \r
- }\r
- G3DModel model = parent.getModel(g);\r
- Collection<Animation> animations = model.getAnimation();\r
- for (Animation animation : animations) {\r
- Collection<Interpolator> interpolators = animation.getInterpolator();\r
- for (Interpolator interpolator : interpolators) {\r
- IEntity target = interpolator.getTarget();\r
- for (Resource property : mappedProperties) {\r
- if (target.getResource().equals(property)) {\r
- ShapeEditorResources.curveBuilder.createDefault(interpolator);\r
- }\r
- }\r
- }\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
-\r
-\r
-\r
- }\r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.views;\r
-\r
-import org.eclipse.swt.widgets.Composite;\r
-\r
-import org.simantics.db.management.ISessionContext;\r
-import org.simantics.layer0.utils.viewpoints.ResourceViewpoint;\r
-import org.simantics.proconf.browsing.GraphExplorer;\r
-import org.simantics.proconf.browsing.views.GraphExplorerView;\r
-import org.simantics.proconf.g3d.shapeeditor.common.ViewpointGenerator;\r
-\r
-public class CSGModellingView extends GraphExplorerView {\r
-\r
- @Override\r
- protected GraphExplorer createExplorer(Composite parent) {\r
- return super.createExplorer(parent);\r
- }\r
- \r
- @Override\r
- protected ResourceViewpoint getViewpoint(ISessionContext context) {\r
- return ViewpointGenerator.createViewpoint();\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.views;\r
-\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.List;\r
-\r
-import org.eclipse.jface.dialogs.InputDialog;\r
-import org.eclipse.jface.dialogs.MessageDialog;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.SelectionAdapter;\r
-import org.eclipse.swt.events.SelectionEvent;\r
-import org.eclipse.swt.layout.FillLayout;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.widgets.Button;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.Text;\r
-import org.eclipse.swt.widgets.Tree;\r
-import org.eclipse.ui.forms.IFormColors;\r
-import org.simantics.proconf.g3d.csg.stubs.CSGModel;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.equation.stubs.SecondOrderScalarPolynomial;\r
-import org.simantics.animation.stubs.Animation;\r
-import org.simantics.animation.stubs.Interpolator;\r
-import org.simantics.layer0.utils.ResourceDebugUtils;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.proconf.browsing.GraphExplorer;\r
-import org.simantics.proconf.browsing.GraphExplorerInputFactory;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-import org.simantics.proconf.g3d.shapeeditor.ShapeEditorResources;\r
-import org.simantics.proconf.g3d.shapeeditor.common.ViewpointGenerator;\r
-import org.simantics.proconf.g3d.tools.OESelectionListener;\r
-import org.simantics.proconf.g3d.tools.PropertyTree;\r
-import org.simantics.proconf.g3d.views.SinglePageResourceEditor;\r
-import org.simantics.utils.ui.widgets.TrackedModifyEvent;\r
-import org.simantics.utils.ui.widgets.TrackedModifyListener;\r
-import org.simantics.utils.ui.widgets.TrackedText;\r
-\r
-\r
-public class ParameterizationEditor extends SinglePageResourceEditor { //implements ISelectionProvider{\r
- \r
- //ParameterizedCSGModel model;\r
- Resource modelResource;\r
- private TrackedText modelName = null;\r
- StructuredResourceSelection hierarchySelection = new StructuredResourceSelection();\r
- StructuredResourceSelection parameterSelection = new StructuredResourceSelection();\r
- GraphExplorer parameterExplorer;\r
- GraphExplorer hierarchyExplorer;\r
- Button deleteParameterButton;\r
- Button clearButton;\r
- PropertyTree propertiesTree;\r
- Button generateButton;\r
- Button askButton;\r
- Button overrideButton;\r
- Composite parent;\r
- \r
- \r
- @Override\r
- protected String getFormText() {\r
- return "Parameterization Editor";\r
- }\r
-\r
-// @Override\r
-// protected void beforeCreateWidgets() {\r
-// if (!(getInputResource().isInstanceOf(GlobalIdMap.get(CSGModelingOntologyMapping.PARAMETERIZED_CSG_MODEL))))\r
-// throw new RuntimeException("Trying to open resource that is not paramaterized CSG model");\r
-// model = ParameterizedCSGModelFactory.create(getInputResource());\r
-// }\r
- \r
- \r
-\r
- @Override\r
- protected void createWidgets() {\r
- createModelPropertiesGroup(newGridSection(2, 2, false, false, "Model Properties",\r
- "Basic properties for this viewpoint"));\r
- createParametrizationGroup(newGridSection(2, 2, false, false, "Parameterization",\r
- "Create parameterization for selected shapes"));\r
- //getSite().setSelectionProvider(this);\r
- }\r
-\r
- @Override\r
- public void reload(Graph graph) {\r
- modelResource = getInputResource();\r
- parent.getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- reload();\r
- } \r
- });\r
-\r
- }\r
- \r
- public void reload() {\r
-\r
- hierarchyExplorer.setInput(getSessionContext(),GraphExplorerInputFactory.clone(hierarchyExplorer.getInput())\r
- .input(modelResource)\r
- .viewpoint(ViewpointGenerator.createObjectStructureViewpoint())\r
- .toInput());\r
-\r
- parameterExplorer.setInput(getSessionContext(),GraphExplorerInputFactory.clone(parameterExplorer.getInput())\r
- .input(modelResource)\r
- .viewpoint(ViewpointGenerator.createObjectSizingParameterViewpoint(ShapeEditorResources.g3dResource.HasSizingParameter))\r
- .toInput());\r
-\r
- }\r
- \r
- private void createParametrizationGroup(Composite parent) {\r
- toolkit.paintBordersFor(parent);\r
- toolkit.setBorderStyle(SWT.BORDER);\r
- \r
- overrideButton = toolkit.createButton(parent, "Overwrite previous parameterizations", SWT.CHECK);\r
- overrideButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- askButton.setEnabled(overrideButton.getSelection());\r
- \r
- }\r
- });\r
-\r
- \r
- askButton = toolkit.createButton(parent, "Ask before overwriting", SWT.CHECK);\r
- askButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- \r
- \r
- }\r
- });\r
- askButton.setEnabled(false);\r
- \r
- generateButton = toolkit.createButton(parent, "Generate linear parameterization", SWT.PUSH);\r
- generateButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- generateMappings();\r
- \r
- }\r
- });\r
- generateButton.setEnabled(false);\r
- \r
- \r
- }\r
- \r
- private CSGModel getModel(Graph graph) {\r
- return new CSGModel(graph, modelResource);\r
- }\r
- \r
- private void createModelPropertiesGroup(Composite p) {\r
- parent = p;\r
- toolkit.paintBordersFor(parent);\r
- toolkit.setBorderStyle(SWT.BORDER);\r
- \r
- GridData gridData1 = new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1);\r
- GridData gridData2 = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);\r
-\r
- // Name\r
- Label l1 = toolkit.createLabel(parent, "Name:");\r
- l1.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));\r
- Text text = toolkit.createText(parent, "TODO: Insert model's name here", SWT.SINGLE);\r
- GridData textLayout = new GridData(GridData.FILL, GridData.FILL, true, true);\r
- text.setLayoutData(textLayout);\r
- modelName = new TrackedText(text);\r
- modelName.addModifyListener(new TrackedModifyListener(){\r
- @Override\r
- public void modifyText(TrackedModifyEvent e) {\r
- final String name = e.getText();\r
- getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- getModel(g).setName(name);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- }\r
- });\r
- \r
- l1.setLayoutData(gridData1);\r
- text.setLayoutData(gridData2);\r
- \r
- \r
- // Parameters\r
- Label parameterLabel = toolkit.createLabel(parent, "Parameters:");\r
- parameterLabel.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));\r
- parameterLabel.setLayoutData(gridData1);\r
- \r
- parameterExplorer = new GraphExplorer(parent, SWT.SINGLE); //new OntologyExplorer("ParameterExplorer", this, getInput("ParameterExplorer", model.getId()));\r
- parameterExplorer.getViewer().addPostSelectionChangedListener(new OESelectionListener() {\r
-\r
- protected void resourceSelectionUpdated(StructuredResourceSelection sel) {\r
- parameterSelection = sel;\r
- if (parameterSelection.size() == 0) {\r
- deleteParameterButton.setEnabled(false);\r
- clearButton.setEnabled(false);\r
- } else {\r
- deleteParameterButton.setEnabled(true);\r
- clearButton.setEnabled(true);\r
- }\r
- updateGenerateButtonStatus();\r
- }\r
- \r
- });\r
- Tree oe = parameterExplorer.getTree();\r
- toolkit.adapt(oe, true, true);\r
- GridData gd3 = new GridData(GridData.FILL, GridData.FILL, true, true,1,1);\r
- gd3.heightHint = 50;\r
- oe.setLayoutData(gd3);\r
-// parameterExplorer.init(getLastMemento(), ViewpointUtils.getModelledHandler(parameterExplorer.getGraph(), Builtins.DefaultViewpointId), null, ViewLabelProviderDecorationSettings.DEFAULT, new MenuAboutToShowAction(), new NullAdditionAction(), false);\r
-// parameterScheme = new ParameterSelectionScheme(parameterExplorer);\r
-// parameterExplorer.setSelectionScheme(parameterScheme);\r
- \r
- // Buttons to add and remove parameters\r
- toolkit.createLabel(parent, "");\r
- Composite buttons = toolkit.createComposite(parent);\r
-\r
- buttons.setLayout(new FillLayout(SWT.HORIZONTAL));\r
- Button newParameterButton = toolkit.createButton(buttons, "New Parameter", SWT.PUSH);\r
- newParameterButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- InputDialog dialog = new InputDialog(ParameterizationEditor.this.getSite().getShell(),"New Parameter","Enter parameter's name","new parameter",null);\r
- if (dialog.open() == InputDialog.CANCEL)\r
- return;\r
- final String name = dialog.getValue();\r
- if (name.length() < 1) \r
- return; // TODO : show error\r
- \r
- getSession().asyncWrite(new GraphRequestAdapter() {\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- //fi.vtt.simantics.layer0.stubs.Double parameter = DoubleFactory.createDefault(g);\r
- //getModel(g).addStatement(ShapeEditorResources.g3dResource.HasSizingParameter, parameter);\r
- //parameter.setValue(new double[]{1.0});\r
- //parameter.setName(name);\r
- Resource parameter = getModel(g).addRelatedScalarDouble(ShapeEditorResources.g3dResource.HasSizingParameter, 1.0).getResource();\r
- IEntity thing = EntityFactory.create(g,parameter);\r
- thing.setName(name);\r
- return GraphRequestStatus.transactionComplete();\r
- };\r
- });\r
- \r
- \r
- }\r
- });\r
- deleteParameterButton = toolkit.createButton(buttons, "Delete Parameter", SWT.PUSH);\r
- deleteParameterButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- //StructuredResourceSelection s = (StructuredResourceSelection)parameterScheme.getSelection();\r
- final StructuredResourceSelection s = parameterSelection;\r
- if (s.size() != 1)\r
- return;\r
- // we'll have to start write transaction, since we may have to change the graph\r
- getSession().asyncWrite(new GraphRequestAdapter() {\r
- boolean proceed;\r
- IEntity selectedParameter;\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- selectedParameter = EntityFactory.create(g,s.getSelectionList().get(0));\r
- \r
- Collection<IEntity> parameters = selectedParameter.getRelatedObjects(ShapeEditorResources.g3dResource.HasSizingParameter);\r
- if (parameters.size() > 0) {\r
- final MessageDialog dialog = new MessageDialog(ParameterizationEditor.this.getSite().getShell(),"Deleting a parameter",null,"Parameter is in use, doe you wan't to remove it?",MessageDialog.QUESTION,new String[]{"OK","Cancel"},1);\r
- parent.getDisplay().syncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- proceed = (dialog.open() != 1);\r
- }\r
- });\r
- if (proceed) {\r
- getModel(g).removeStatement(ShapeEditorResources.g3dResource.HasSizingParameter,selectedParameter);\r
- }\r
- }\r
- \r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- }\r
- });\r
- deleteParameterButton.setEnabled(false);\r
- \r
- clearButton = toolkit.createButton(buttons, "Clear Parameter", SWT.PUSH);\r
- clearButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- final StructuredResourceSelection s = parameterSelection;\r
- if (s.size() != 1)\r
- return;\r
- getSession().asyncWrite(new GraphRequestAdapter() {\r
- boolean proceed;\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- IEntity selectedParameter = EntityFactory.create(g,s.getSelectionList().get(0));\r
- Collection<IEntity> equations = selectedParameter.getRelatedObjects(ShapeEditorResources.equationResource.HasTarget);\r
- final String name = selectedParameter.getName();\r
- if (equations.size() > 0) {\r
- final MessageDialog dialog = new MessageDialog(ParameterizationEditor.this.getSite().getShell(),"Clearing a parameter",null,"Do you wan't to clear parameterization for "+ name + " ?\nIt has " + equations.size() + " mappings.",MessageDialog.QUESTION,new String[]{"OK","Cancel"},1); \r
- parent.getDisplay().syncExec(new Runnable() {\r
- public void run() {\r
- proceed = (dialog.open() != 1);\r
- };\r
- });\r
- if (proceed) {\r
- for (IEntity eq : equations) {\r
- eq.removeRelatedStatements(ShapeEditorResources.equationResource.HasSource);\r
- eq.removeRelatedStatements(ShapeEditorResources.equationResource.HasTarget);\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- }\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- });\r
- \r
- \r
- }\r
- });\r
- clearButton.setEnabled(false);\r
- \r
- Label hierarchyLabel = toolkit.createLabel(parent, "Model Hierarchy:");\r
- hierarchyLabel.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));\r
- hierarchyLabel.setLayoutData(gridData1);\r
- \r
- hierarchyExplorer = new GraphExplorer(parent,SWT.MULTI); //new OntologyExplorer("HierarchyExplorer", this, getInput("HierarchyExplorer", model.getId()));\r
- Tree oeh = hierarchyExplorer.getTree();//hierarchyExplorer.getControl(parent, 1, OntologyExplorer.OntologyTree, SWT.MULTI);\r
- toolkit.adapt(oeh, true, true);\r
- \r
- GridData gd4 = new GridData(GridData.FILL, GridData.FILL, true, true,1,1);\r
- gd4.heightHint = 200;\r
- oeh.setLayoutData(gd4);\r
- hierarchyExplorer.getViewer().addPostSelectionChangedListener(new OESelectionListener() {\r
-\r
- protected void resourceSelectionUpdated(StructuredResourceSelection sel) {\r
- hierarchySelection = sel;\r
- updatePropertiesTable();\r
- updateGenerateButtonStatus();\r
- }\r
- \r
- private void updatePropertiesTable() {\r
- propertiesTree.setProperties(hierarchySelection);\r
- \r
- }\r
- \r
- });\r
- //hierarchyExplorer.init(getLastMemento(), ViewpointUtils.getModelledHandler(hierarchyExplorer.getGraph(), CSGModelingOntologyMapping.CSG_MODEL_HIERARCHY_VIEWPOINT), null, ViewLabelProviderDecorationSettings.DEFAULT, new MenuAboutToShowAction(), new NullAdditionAction(), false);\r
-// hierarchyScheme = new HierarchySelectionScheme(hierarchyExplorer);\r
-// hierarchyExplorer.setSelectionScheme(hierarchyScheme);\r
-// hierarchyExplorer.hookPageSelection(this);\r
- Label propertiesLabel = toolkit.createLabel(parent, "Available properties:");\r
- propertiesLabel.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));\r
- propertiesLabel.setLayoutData(gridData1); \r
- \r
- //propertiesTable = toolkit.createTable(parent, SWT.MULTI);\r
- Tree tree = toolkit.createTree(parent, SWT.MULTI);\r
- propertiesTree = new PropertyTree(tree,getSession());\r
- //\r
- GridData gd5 = new GridData(GridData.FILL, GridData.FILL, true, true,1,1);\r
- gd5.heightHint = 200;\r
- //propertiesTable.setLayoutData(gd5);\r
- tree.setLayoutData(gd5);\r
- tree.addSelectionListener(new SelectionAdapter() {\r
-\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- updateGenerateButtonStatus();\r
- }\r
- \r
- });\r
-\r
- \r
- }\r
- \r
-// private class ParameterSelectionScheme extends AbstractSelectionScheme {\r
-// \r
-// public ParameterSelectionScheme(OntologyExplorer explorer) {\r
-// super(explorer);\r
-// }\r
-//\r
-// @Override\r
-// protected Resource getResourceForSelection(TreeNode selected) {\r
-// Resource resource = explorer.getCoreResource(selected);\r
-// System.out.println("Parameter Tree Selection : " + resource.getId());\r
-// return resource;\r
-// }\r
-//\r
-// @Override\r
-// protected void resourceSelectionUpdated() {\r
-// if (selection.size() == 0) {\r
-// deleteParameterButton.setEnabled(false);\r
-// clearButton.setEnabled(false);\r
-// } else {\r
-// deleteParameterButton.setEnabled(true);\r
-// clearButton.setEnabled(true);\r
-// }\r
-// updateGenerateButtonStatus();\r
-// }\r
-// }\r
-// \r
-// private class HierarchySelectionScheme extends AbstractSelectionScheme {\r
-//\r
-// public HierarchySelectionScheme(OntologyExplorer explorer) {\r
-// super(explorer);\r
-// }\r
-// \r
-// @Override\r
-// protected Resource getResourceForSelection(TreeNode selected) {\r
-// Resource resource = explorer.getCoreResource(selected);\r
-// System.out.println("Hierarchy Tree Selection : " + resource.getId());\r
-// return resource;\r
-// }\r
-// \r
-// @Override\r
-// protected void resourceSelectionUpdated() {\r
-// updatePropertiesTable();\r
-// updateGenerateButtonStatus();\r
-// }\r
-//\r
-// private void updatePropertiesTable() {\r
-// propertiesTree.setProperties(selection);\r
-// \r
-// }\r
-// \r
-// }\r
- \r
-// private boolean contains(Resource list[], Resource value) {\r
-// for (int i = 0; i < list.length; i++) {\r
-// if (list[i].equals(value))\r
-// return true;\r
-// }\r
-// return false;\r
-// }\r
- \r
- private void updateGenerateButtonStatus() {\r
- if (parameterSelection.size() == 0) {\r
- generateButton.setEnabled(false);\r
- return;\r
- }\r
- if (hierarchySelection.size() == 0) {\r
- generateButton.setEnabled(false);\r
- return;\r
- }\r
- if (propertiesTree.getTree().getSelection().length == 0) {\r
- generateButton.setEnabled(false);\r
- return;\r
- }\r
- generateButton.setEnabled(true);\r
- }\r
- \r
- List<Resource> res;\r
- \r
- private void generateMappings() {\r
- final StructuredResourceSelection selectedShapes = hierarchySelection;\r
- final StructuredResourceSelection selectedParameter = parameterSelection;\r
- \r
- final boolean override = overrideButton.getSelection();\r
- final boolean ask = askButton.getSelection();\r
- //TreeItem[] selectedProperties = propertiesTree.getTree().getSelection();\r
- \r
- assert (selectedParameter.size() == 1);\r
- assert (selectedShapes.size() > 0);\r
- //assert(selectedProperties.length > 0);\r
- getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- //fi.vtt.simantics.layer0.stubs.Double parameter = DoubleFactory.create(g,selectedParameter.getSelectionList().get(0));\r
- IEntity parameter = EntityFactory.create(g,selectedParameter.getSelectionList().get(0));\r
- Collection<IEntity> prop = parameter.getRelatedObjects(ShapeEditorResources.g3dResource.HasDefaultDoubleValue);\r
- //fi.vtt.simantics.layer0.stubs.Double defaultValue;\r
- double value = g.getScalarDouble(parameter.getResource());\r
- if (prop.size() == 0) {\r
- //defaultValue = DoubleFactory.createDefault(g);\r
- //parameter.addStatement(ShapeEditorResources.g3dResource.HasDefaultDoubleValue, defaultValue);\r
- parameter.addRelatedScalarDouble(ShapeEditorResources.g3dResource.HasDefaultDoubleValue, value);\r
- } else {\r
- //defaultValue = DoubleFactory.create(prop.iterator().next());\r
- g.setScalarDouble(prop.iterator().next().getResource(),value);\r
- }\r
- //defaultValue.setValue(parameter.getValue());\r
- final Graph graph = g;\r
- parent.getDisplay().syncExec(new Runnable() {\r
- public void run() {\r
- res = propertiesTree.findLeafPropertyInstances(graph, selectedShapes.getSelectionList());\r
- };\r
- });\r
- \r
- \r
- double refValue = parameter.toProperty().getScalarDouble();\r
- ArrayList<Resource> mappedProperties = new ArrayList<Resource>();\r
- \r
- for (Resource r : res) {\r
- IEntity propertyThing = EntityFactory.create(g,r);\r
- assert (propertyThing.isInstanceOf(g.getBuiltins().Double));\r
- final String name = ResourceDebugUtils.getReadableNameForEntity(propertyThing);\r
- double rb = propertyThing.toProperty().getScalarDouble();\r
- System.out.println("Mapping to " + name + " " + rb);\r
- Collection<IEntity> equations = propertyThing.getRelatedObjects(ShapeEditorResources.equationResource.HasSource);\r
- if (equations.size() != 0) {\r
- mappedProperties.add(propertyThing.getResource());\r
- if (override) {\r
- System.out.println("Override");\r
- boolean over = true;\r
- if (ask) {\r
- IEntity t = propertyThing;\r
- while (t.isInstanceOf(g.getBuiltins().Property)) {\r
- Collection<IEntity> ts = t.getRelatedObjects(g.getBuiltins().PropertyOf);\r
- // FIXME : traverse all possible routes\r
- t = ts.iterator().next();\r
- }\r
- //StructuredResourceSelection selection = new StructuredResourceSelection(t.getResource());\r
- // TODO : do the selection!\r
- //hierarchyScheme.setSelection(selection);\r
- //fireSelectionChanged();\r
- MessageDialog dialog = new MessageDialog(ParameterizationEditor.this.getSite().getShell(),\r
- "Override mapping",\r
- null,\r
- "Override mapping to property of highlighted shape?",\r
- MessageDialog.QUESTION, new String[] {\r
- "Yes","No", "Cancel" }, 0);\r
- int i = dialog.open();\r
- if (i == 2)\r
- return GraphRequestStatus.transactionCancel();\r
- over = (i == 0);\r
- }\r
- if (over) {\r
- \r
- }\r
- } else {\r
- if (equations.size() != 1) {\r
- throw new RuntimeException("One property can have only one euquation as source function.");\r
- }\r
- IEntity equation = equations.iterator().next();\r
- if (!equation.isInstanceOf(ShapeEditorResources.equationResource.SecondOrderScalarPolynomial)) {\r
- throw new RuntimeException("Only Second order scalar polynomials are supported");\r
- }\r
- SecondOrderScalarPolynomial s = new SecondOrderScalarPolynomial(equation);\r
- s.setA(new double[]{0.0});\r
- s.setB(new double[]{rb / refValue});\r
- s.setC(new double[]{0.0});\r
- \r
- }\r
- } else { //override\r
- // create relation\r
- SecondOrderScalarPolynomial s = SecondOrderScalarPolynomial.createDefault(g);\r
- s.setA(new double[]{0.0});\r
- s.setB(new double[]{rb / refValue});\r
- s.setC(new double[]{0.0});\r
- \r
- // FIXME : these relations have been instantiated, but addStatements won't delete them so we have to delete them manually.\r
- s.removeRelatedStatements(ShapeEditorResources.equationResource.HasTarget);\r
- s.removeRelatedStatements(ShapeEditorResources.equationResource.HasSource);\r
- \r
- parameter.addStatement(ShapeEditorResources.equationResource.HasTarget, s);\r
- \r
- s.addStatement(ShapeEditorResources.equationResource.HasTarget, propertyThing);\r
- mappedProperties.add(propertyThing.getResource());\r
- }\r
- \r
- }\r
- CSGModel model = getModel(g);\r
- Collection<Animation> animations = model.getAnimation();\r
- for (Animation animation : animations) {\r
- Collection<Interpolator> interpolators = animation.getInterpolator();\r
- for (Interpolator interpolator : interpolators) {\r
- IEntity target = interpolator.getTarget();\r
- for (Resource property : mappedProperties) {\r
- if (target.getResource().equals(property)) {\r
- ShapeEditorResources.curveBuilder.createDefault(interpolator);\r
- }\r
- }\r
- }\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
-\r
-\r
-\r
- }\r
- \r
-}\r
-\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.views;\r
-\r
-import java.util.Collection;\r
-import java.util.HashSet;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.jface.action.IStatusLineManager;\r
-import org.eclipse.jface.viewers.ISelection;\r
-import org.eclipse.jface.viewers.ISelectionChangedListener;\r
-import org.eclipse.jface.viewers.SelectionChangedEvent;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.ui.IWorkbenchPart;\r
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;\r
-import org.simantics.db.ContextGraph;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.GraphRequestWithResult;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
-import org.simantics.db.management.ISessionContext;\r
-import org.simantics.equation.solver.Solver;\r
-import org.simantics.layer0.stubs.Property;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.proconf.g3d.actions.InteractiveAction;\r
-import org.simantics.proconf.g3d.actions.TranslateAction;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.JmeRenderingComponent;\r
-import org.simantics.proconf.g3d.base.ScenegraphAdapter;\r
-import org.simantics.proconf.g3d.base.ScenegraphAdapterImpl;\r
-import org.simantics.proconf.g3d.base.SelectionAdapter;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorProvider;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-import org.simantics.proconf.g3d.csg.stubs.CSGModel;\r
-import org.simantics.proconf.g3d.csg.stubs.Primitive;\r
-import org.simantics.proconf.g3d.dnd.DropListener;\r
-import org.simantics.proconf.g3d.scenegraph.AbstractGraphicsNode;\r
-import org.simantics.proconf.g3d.scenegraph.IGeometryNode;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.scenegraph.ISelectableNode;\r
-import org.simantics.proconf.g3d.shapeeditor.ShapeEditorResources;\r
-import org.simantics.proconf.g3d.shapeeditor.actions.ExportAction;\r
-import org.simantics.proconf.g3d.shapeeditor.actions.ImportAction;\r
-import org.simantics.proconf.g3d.shapeeditor.scenegraph.CSGShapeNode;\r
-import org.simantics.proconf.g3d.shapeeditor.tools.AnimationContribution;\r
-import org.simantics.proconf.g3d.shapeeditor.tools.CSGModellingContribution;\r
-import org.simantics.proconf.g3d.shapeeditor.tools.ParameterizationContribution;\r
-import org.simantics.proconf.g3d.shapes.GridShape;\r
-import org.simantics.proconf.g3d.stubs.G3DModel;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-import org.simantics.proconf.g3d.stubs.Shape;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-import org.simantics.utils.ui.jface.MenuTools;\r
-\r
-public class ShapeEditorBase extends ThreeDimensionalEditorBase {\r
-\r
- // currently each 3D-model has a root object which is ShapeGroup\r
- protected Resource model = null;\r
- \r
- protected boolean isParameterized;\r
- \r
- private Action exportAction;\r
- private Action importAction;\r
- \r
- public ShapeEditorBase(ISessionContext session) {\r
- super(session);\r
- addEditorContribution(new CSGModellingContribution(this));\r
- addEditorContribution(new AnimationContribution(this));\r
- addEditorContribution(new ParameterizationContribution(this));\r
- }\r
-\r
- public ShapeEditorBase(ISessionContext session, JmeRenderingComponent component) {\r
- super(session,component);\r
- addEditorContribution(new CSGModellingContribution(this));\r
- addEditorContribution(new AnimationContribution(this));\r
- addEditorContribution(new ParameterizationContribution(this));\r
- }\r
-\r
- @Override\r
- protected ScenegraphAdapter createScenegraphAdapter() {\r
- return new ShapeEditorAdapter(session, getRenderingComponent());\r
- }\r
-\r
- @Override\r
- public void createControl(Graph graph,Composite parent) {\r
- super.createControl(graph,parent);\r
- getRenderingComponent().getNoCastRoot().attachChild(GridShape.getShape(getRenderingComponent().getDisplaySystem().getRenderer(), 10, 1.f));\r
- }\r
-\r
-// private void loadGroup(Graph graph) {\r
-// assert (model != null);\r
-// adapter.addOutbound(EntityFactory.create(graph,model));\r
-// //assert (abstractGraphicsNodes.size() == 1);\r
-//\r
-// }\r
-\r
- protected void makeActions(Graph graph) {\r
- super.makeActions(graph);\r
- exportAction = new ExportAction(this);\r
- importAction = new ImportAction(this);\r
- }\r
-\r
- @Override\r
- protected void fillLocalPullDown() {\r
- super.fillLocalPullDown();\r
- MenuTools.getOrCreate(getMenuID(),"Model", menuManager).add(exportAction);\r
- MenuTools.getOrCreate(getMenuID(),"Model", menuManager).add(importAction);\r
- }\r
- \r
-\r
- \r
- /*\r
- * These are used for updating CSG models geometry when internal shapes are moved. Interactive update is not possible\r
- * because recalculation of geometry takes too much time. There are several problems in this method:\r
- * 1. it relies on instanceof check \r
- * 2. when shape is moved, transformations of its children are updated, which causes all\r
- * child geometries to be updated, which is not necessary. We want to update only moved\r
- * shape, since updateAllGemetry method takes care of parents. \r
- * \r
- * TODO : this functionality should be moved to TranslateAction\r
- * TODO : prevent moved shape's children to be updated.\r
- */\r
- \r
- @Override\r
- public void setCurrentAction(InteractiveAction action) {\r
- if (getCurrentAction() == action)\r
- return;\r
- if (getCurrentAction() != null && getCurrentAction() instanceof TranslateAction) {\r
- runGeometryUpdates();\r
- }\r
- super.setCurrentAction(action);\r
- }\r
- \r
- private void runGeometryUpdates() {\r
- // now we'll just filter out all parents so that they won't be updated multiple times.\r
- HashSet<CSGShapeNode> parents = new HashSet<CSGShapeNode>();\r
- for (CSGShapeNode n : geometryUpdates) {\r
- IGraphicsNode parent = n.getParent();\r
- if (parent instanceof CSGShapeNode)\r
- parents.add((CSGShapeNode)parent);\r
- }\r
- for (CSGShapeNode n : geometryUpdates) {\r
- if (!parents.contains(n))\r
- n.updateAllGeometry();\r
- }\r
- geometryUpdates.clear();\r
- }\r
- \r
- private HashSet<CSGShapeNode> geometryUpdates = new HashSet<CSGShapeNode>();\r
- \r
- private void geometryUpdate(CSGShapeNode shape) {\r
- \r
- if (!(getCurrentAction() instanceof TranslateAction)) {\r
- shape.updateAllGeometry();\r
- } else {\r
- geometryUpdates.add(shape);\r
- }\r
- }\r
- \r
- public Graph createParameterization(Graph g) {\r
- if (isParameterized) {\r
- ContextGraph graph;\r
- if (!(g instanceof ContextGraph)) {\r
- graph = new ContextGraph(g);\r
- graph.setContext(model);\r
- } else {\r
- graph = (ContextGraph)g;\r
- }\r
- Solver solver = new Solver();\r
- Collection<org.simantics.layer0.utils.Property> parameters = getModel(graph).getRelatedProperties(ShapeEditorResources.g3dResource.HasSizingParameter);\r
- for (org.simantics.layer0.utils.Property p : parameters) {\r
- IEntity t = EntityFactory.create(graph, p.getResource());\r
- Collection<IEntity> exp = t.getRelatedObjects(ShapeEditorResources.equationResource.HasTarget);\r
- if (exp.size() > 0) {\r
- Iterator<IEntity> i = exp.iterator();\r
- while (i.hasNext())\r
- solver.evaluate(i.next());\r
- } else {\r
- ErrorLogger.defaultLogWarning("Model property " + p + " is not bound to a expression", null);\r
- }\r
- }\r
- solver.pushToGraph(graph);\r
- return graph;\r
- } else {\r
- return g;\r
- }\r
- }\r
- \r
- \r
-\r
- protected class ShapeEditorAdapter extends ScenegraphAdapterImpl {\r
-\r
- public ShapeEditorAdapter(Session session,JmeRenderingComponent component) {\r
- super(session,component);\r
- }\r
- \r
- @Override\r
- public synchronized void updateGeometry(Graph graph) {\r
- if (isParameterized) {\r
- graph = createParameterization(graph); \r
- }\r
- super.updateGeometry(graph);\r
- }\r
- \r
- \r
- \r
- protected AbstractGraphicsNode instantiateNode(IGraphicsNode comp,\r
- G3DNode node) {\r
- CSGShapeNode mo = new CSGShapeNode(ShapeEditorBase.this, comp, node.getGraph(),node.getResource());\r
- updateGeometry(mo);\r
- return mo;\r
- }\r
-\r
- \r
- private class ShapeEditorScenegraphQuery extends ScenegraphQuery {\r
- \r
- public ShapeEditorScenegraphQuery(Resource nodeResource) {\r
- super(nodeResource);\r
- }\r
- \r
- @Override\r
- public void shapeAdded(Graph graph,IGraphicsNode n) {\r
- updateGeometry((CSGShapeNode) n);\r
-\r
- if (n.getG3DNode(graph).getParent() == null) {\r
- if (DEBUG)System.out.println("ShapeSubnodeListener "\r
- + n.getResource()\r
- + " has no parent");\r
- return;\r
- }\r
- if (DEBUG) System.out.print("ShapeSubnodeListener " + n.getResource());\r
- if (n.getG3DNode(graph).getRelatedObjects(ShapeEditorResources.g3dResource.GeometryDefinitionOf).size() == 0) {\r
- if (DEBUG) System.out.println(" visible");\r
- ((ISelectableNode)n).setVisible(true);\r
- } else {\r
- if (DEBUG) System.out.println(" invisible");\r
- ((ISelectableNode)n).setVisible(false);\r
- }\r
- }\r
- \r
-// @Override\r
-// public NodeQuery instantiateQuery(Resource node) {\r
-// return new ShapeEditorScenegraphQuery(node);\r
-// }\r
- }\r
- \r
- @Override\r
- protected ScenegraphQuery newSubnodeListener(G3DNode node) {\r
- return new ShapeEditorScenegraphQuery(node.getResource());\r
- }\r
- \r
- private class ShapeEditorNodePropertyQuery extends NodePropertyQuery {\r
- public ShapeEditorNodePropertyQuery(Resource nodeResource) {\r
- super(nodeResource);\r
- }\r
- \r
- @Override\r
- public void shapeUpdated(Graph graph,final IGraphicsNode shape) {\r
- if (DEBUG) System.out.println("Tri - Shape id " + shape + " modified");\r
- ((CSGShapeNode) shape).updateAllGeometry();\r
- }\r
- \r
-// @Override\r
-// public NodeQuery instantiateQuery(Resource node) {\r
-// return new ShapeEditorNodePropertyQuery(node);\r
-// }\r
- }\r
-\r
- @Override\r
- protected NodePropertyQuery newPropertyListener(G3DNode node) {\r
- return new ShapeEditorNodePropertyQuery(node.getResource());\r
- }\r
- \r
- private class ShapeEditorNodeTransformationQuery extends NodeTransformationQuery {\r
- public ShapeEditorNodeTransformationQuery(Resource nodeResource) {\r
- super(nodeResource);\r
- }\r
- \r
- @Override\r
- public void shapeUpdated(Graph graph,final IGraphicsNode shape) {\r
- if (DEBUG) System.out.println("Tra - Shape id " + shape + " modified");\r
- ((CSGShapeNode) shape).updateTransform(graph);\r
- geometryUpdate((CSGShapeNode)shape);\r
- }\r
- \r
-// @Override\r
-// public NodeQuery instantiateQuery(Resource node) {\r
-// return new ShapeEditorNodePropertyQuery(node);\r
-// }\r
- }\r
-\r
- @Override\r
- protected NodeTransformationQuery newTransformationListener(G3DNode node) {\r
- return new ShapeEditorNodeTransformationQuery(node.getResource());\r
- }\r
- \r
- private class ShapeEditorRootPropertyQuery extends NodePropertyQuery {\r
- public ShapeEditorRootPropertyQuery(Resource nodeResource) {\r
- super(nodeResource);\r
- }\r
- \r
- @Override\r
- public void shapeUpdated(Graph graph, final IGraphicsNode shape) {\r
- if (DEBUG)System.out.println("Tri - Shape id " + shape + " modified");\r
-\r
- updateParameterizationStatus(graph);\r
- if (isParameterized) {\r
- for (IGraphicsNode n : getNodes())\r
- if (n instanceof IGeometryNode)\r
- updateGeometry((IGeometryNode) n);\r
- }\r
- }\r
- \r
-// @Override\r
-// public NodeQuery instantiateQuery(Resource node) {\r
-// return new ShapeEditorRootPropertyQuery(node);\r
-// }\r
- }\r
- \r
- @Override\r
- protected NodePropertyQuery newRootPropertyListener(G3DNode root) {\r
- return new ShapeEditorRootPropertyQuery(root.getResource());\r
- }\r
- \r
- }\r
-\r
- protected void contributeStatusBar(IStatusLineManager manager) {\r
- }\r
-\r
- /**\r
- * Loads the initial scene: all further updates to the view are done by\r
- * listening changes in the shapes and int the shape group\r
- * \r
- * @param resource\r
- */\r
- protected void reloadFrom(IEntity thing) {\r
- if (model != null) {\r
- throw new UnsupportedOperationException(\r
- "Reloading instantiated viewer not supported");\r
-\r
- }\r
- if (thing.isInstanceOf(ShapeEditorResources.csgResource.CSGModel)) {\r
- //System.out.print("ShapeEditorView.reloadFrom() : model");\r
- Graph g = thing.getGraph();\r
- model = thing.getResource();\r
- //System.out.println(" " + model.getResource());\r
- adapter.setRootNode(new G3DNode(thing));\r
- updateParameterizationStatus(g);\r
- \r
- //loadGroup(thing.getGraph());\r
- \r
- } else {\r
- throw new UnsupportedOperationException("Cannot load ShapeViewer for Resource:" + thing);\r
- }\r
-\r
- }\r
- \r
- private void updateParameterizationStatus(Graph graph) {\r
- G3DModel model = getModel(graph);\r
- if(model.getRelatedObjects(ShapeEditorResources.g3dResource.HasSizingParameter).size() > 0) {\r
- isParameterized = true;\r
- } else {\r
- isParameterized = false;\r
- }\r
- parent.getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
-// for (Action a : addActions)\r
-// a.setEnabled(!isParameterized);\r
-// unionAction.setEnabled(!isParameterized);\r
-// differenceAction.setEnabled(!isParameterized);\r
-// intersectionAction.setEnabled(!isParameterized);\r
-// linkAction.setEnabled(!isParameterized);\r
-// unlinkAction.setEnabled(!isParameterized);\r
-// translateAction.setEnabled(!isParameterized);\r
-// rotateAction.setEnabled(!isParameterized);\r
-// removeAction.setEnabled(!isParameterized);\r
- }\r
- \r
- });\r
- }\r
-\r
- public Resource getModelResource() {\r
- return model;\r
- }\r
- \r
- public G3DModel getModel(Graph graph) {\r
- return new G3DModel(graph, model);\r
- }\r
-\r
- @Override\r
- protected SelectionAdapter createSelectionAdapter() {\r
- return new ShapeEditorSelectionAdapter(adapter);\r
- }\r
-\r
- protected class ShapeEditorSelectionAdapter extends SelectionAdapter {\r
-\r
- public ShapeEditorSelectionAdapter(ScenegraphAdapter adapter) {\r
- super(adapter);\r
- }\r
-\r
- public void setEditorSelection() {\r
- List<IGraphicsNode> sel = getSelectedObjects();\r
- for (IGraphicsNode o : adapter.getNodes())\r
- if (o instanceof ISelectableNode) {\r
- ISelectableNode n = (ISelectableNode)o;\r
- if (sel.contains(o))\r
- n.setSelected(true);\r
- else\r
- n.setSelected(false);\r
- }\r
- List<Resource> selected = getSelectedResources();\r
- for (Resource r : selected) {\r
- if (!adapter.hasNode(r)) {\r
- //adapter.addInbound(r).setSelected(true);\r
- }\r
- }\r
- }\r
-\r
- public void setEditorHighlightSelection() {\r
- List<IGraphicsNode> sel = getInteractiveSelectedObjects();\r
- for (IGraphicsNode o : adapter.getNodes())\r
- if (o instanceof CSGShapeNode) {\r
- if (sel.contains(o))\r
- ((CSGShapeNode) o).setHighlighted(true);\r
- else\r
- ((CSGShapeNode) o).setHighlighted(false);\r
- }\r
- }\r
-\r
- public void setEditorSelection(boolean addShapes) {\r
-\r
- List<IGraphicsNode> sel = getSelectedObjects();\r
- for (IGraphicsNode o : adapter.getNodes()) \r
- if (o instanceof ISelectableNode) {\r
- ISelectableNode n = (ISelectableNode)o;\r
- if (sel.contains(o)) \r
- n.setSelected(true);\r
- else\r
- n.setSelected(false);\r
- }\r
- viewChanged = true;\r
- if (addShapes) {\r
- session.syncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- List<Resource> selected = getSelectedResources();\r
- for (Resource r : selected) {\r
- if (!adapter.hasNode(r)) {\r
- IEntity t = EntityFactory.create(g, r);\r
- if (t.isInstanceOf(ShapeEditorResources.g3dResource.Shape)) {\r
- G3DNode group = G3DTools.getModelFromResource(g,r);\r
- if (group != null\r
- && group.getResource().equals(model.getResource())) {\r
- //adapter.addInbound(g).setSelected(true);\r
- }\r
-\r
- }\r
- }\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- }\r
- }\r
- }\r
-\r
- /**\r
- * Receives selection changes\r
- * \r
- * @param part\r
- * @param selection\r
- */\r
- protected void pageSelectionChanged(IWorkbenchPart part, ISelection selection) {\r
- \r
- StructuredResourceSelection s = SelectionAdapter.transformSelection(selection);\r
- //System.out.println("ShapeEditorBase.pageSelectionChanged " + s);\r
- selectionAdapter.setCurrentSelection(s);\r
-\r
- if (!(part instanceof ThreeDimensionalEditorProvider)) {\r
- ((ShapeEditorSelectionAdapter) selectionAdapter).setEditorSelection(true);\r
- return;\r
- }\r
- ThreeDimensionalEditorBase e = ((ThreeDimensionalEditorProvider)part).getEditor();\r
- if (!(e instanceof ShapeEditorBase)) {\r
- ((ShapeEditorSelectionAdapter) selectionAdapter).setEditorSelection(true);\r
- return;\r
- }\r
- \r
- ShapeEditorBase editor = (ShapeEditorBase)e;\r
- \r
- if (!editor.getModelResource().equals(model.getResource())) {\r
- selectionAdapter.setCurrentSelection(new StructuredResourceSelection());\r
- ((ShapeEditorSelectionAdapter) selectionAdapter).setEditorSelection(false);\r
- return;\r
- }\r
- selectionAdapter.setEditorSelection();\r
- }\r
-\r
- @Override\r
- protected void hookDragAndDrop() {\r
- super.hookDragAndDrop();\r
- dropTarget.addDropListener(new DropListener() {\r
- public boolean acceptDrop(StructuredResourceSelection s, Resource[] ids) {\r
- if (!s.isEmpty())\r
- return false;\r
- if (ids == null)\r
- return false;\r
- if (ids.length != 1)\r
- return false;\r
- final Resource r = ids[0];\r
- GraphRequestWithResult<Boolean> rq = new GraphRequestWithResult<Boolean>() {\r
- @Override\r
- public Boolean performWithResult(Graph g) throws Exception {\r
- IEntity t = EntityFactory.create(g, r);\r
- return t.isInstanceOf(ShapeEditorResources.csgResource.Primitive);\r
- }\r
- };\r
- session.syncRead(rq);\r
- return rq.getResult();\r
- }\r
-\r
- public void doDrop(StructuredResourceSelection s, Resource[] ids) {\r
- session.asyncWrite(new GraphRequestAdapter() {\r
- Resource r;\r
-\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- IEntity type = EntityFactory.create(g);\r
- IEntity instance = type.instantiate();\r
- Shape shape = new Shape(instance);\r
- resetShape(shape);\r
- CSGModel m = new CSGModel(g, model);\r
- m.getChild().add(shape.toG3DNode()); // FIXME : stubcast\r
- return GraphRequestStatus.transactionComplete();\r
- \r
- };\r
- \r
- @Override\r
- public void requestCompleted(GraphRequestStatus status) {\r
- selectionAdapter\r
- .updateSelection(new StructuredResourceSelection(r));\r
- super.requestCompleted(status);\r
- }\r
- }\r
- );\r
-\r
- }\r
- });\r
- }\r
- \r
- private void resetShape(Shape shape) {\r
- G3DTools.resetTransformation(shape);\r
- Graph graph = shape.getGraph();\r
- if (shape.isInstanceOf(ShapeEditorResources.csgResource.Primitive)) {\r
- Primitive prim = new Primitive(shape);\r
- Collection<Property> c = prim.getSizingProperty();\r
- if (c.size() == 0)\r
- ErrorLogger.getDefault().logWarning("Shape does not contain sizing properties.", null);\r
- \r
- for (Property p : c) {\r
- if (p.isInstanceOf(graph.getBuiltins().Double)) {\r
- graph.setScalarDouble(p.getResource(), 1.0);\r
- } else if (p.isInstanceOf(graph.getBuiltins().Integer)) {\r
- graph.setScalarInteger(p.getResource(), 1);\r
- } else {\r
- ErrorLogger.getDefault().logWarning("Cannot handle sizing property " + p.getName() , null);\r
- }\r
- }\r
- }\r
- \r
- }\r
- \r
- @Override\r
- public Object getAdapter(Class adapter) {\r
- if (adapter == IContentOutlinePage.class) {\r
- if (getModelResource() == null)\r
- return null;\r
- final StructureOutlinePage page = new StructureOutlinePage(sessionContext,getModelResource());\r
- \r
- getSelectionAdapter().addSelectionChangedListener(new ISelectionChangedListener() {\r
- @Override\r
- public void selectionChanged(SelectionChangedEvent event) {\r
- page.setSelection(event.getSelection());\r
- \r
- }\r
- });\r
- parent.getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- page.addSelectionChangedListener(new ISelectionChangedListener() {\r
- @Override\r
- public void selectionChanged(SelectionChangedEvent event) {\r
- selectionAdapter.setSelection(SelectionAdapter.transformSelection(event.getSelection()));\r
- }\r
- });\r
- }\r
- });\r
- \r
- \r
- \r
- return page;\r
- }\r
- return null;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.views;\r
-\r
-import org.simantics.db.management.ISessionContext;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorPart;\r
-\r
-\r
-\r
-\r
-/**\r
- * Shape Editor / CGS-modeling\r
- * \r
- * \r
- * @author Marko Luukkainen\r
- * \r
- */\r
-public class ShapeEditorView extends ThreeDimensionalEditorPart {\r
- \r
- \r
- @Override\r
- protected ThreeDimensionalEditorBase createEditor(ISessionContext session) {\r
- return new ShapeEditorBase(session);\r
- }\r
-\r
-}\r
-\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.views;\r
-\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.management.ISessionContext;\r
-import org.simantics.layer0.utils.viewpoints.ResourceViewpoint;\r
-import org.simantics.proconf.browsing.views.GraphExplorerOutlinePage;\r
-import org.simantics.proconf.g3d.shapeeditor.common.ViewpointGenerator;\r
-\r
-public class StructureOutlinePage extends GraphExplorerOutlinePage {\r
- \r
- \r
- public StructureOutlinePage(ISessionContext session, Resource model) {\r
- super(session,model);\r
- }\r
- \r
- @Override\r
- public ResourceViewpoint getViewPoint(ISessionContext sessionContext) {\r
- return ViewpointGenerator.createObjectStructureViewpoint();\r
- }\r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapeeditor.views;\r
-\r
-import org.simantics.db.management.ISessionContext;\r
-import org.simantics.layer0.utils.viewpoints.ResourceViewpoint;\r
-import org.simantics.proconf.browsing.views.GraphExplorerView;\r
-import org.simantics.proconf.g3d.shapeeditor.common.ViewpointGenerator;\r
-\r
-public class StructureView extends GraphExplorerView {\r
-\r
- @Override\r
- protected void contributeActions() {\r
- }\r
-\r
- @Override\r
- protected ResourceViewpoint getViewpoint(ISessionContext context) {\r
- return ViewpointGenerator.createStuctureViewpoint();\r
- }\r
-\r
- /*\r
- @Override\r
- public String getContributorId() {\r
- return "fi.vtt.simantics.shapeeditor.pcid";\r
- }\r
-\r
- @Override\r
- public Object getAdapter(Class adapter) {\r
- if (adapter == IPropertySheetPage.class) {\r
- return new TabbedPropertySheetPage(this);\r
- }\r
- return super.getAdapter(adapter);\r
- }\r
- */\r
-\r
-}\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<classpath>\r
- <classpathentry excluding="fi/vtt/simantics/g3d/views/AppearanceEditor.java" kind="src" path="src"/>\r
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>\r
- <classpathentry kind="output" path="bin"/>\r
-</classpath>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<projectDescription>\r
- <name>org.simantics.g3d</name>\r
- <comment></comment>\r
- <projects>\r
- </projects>\r
- <buildSpec>\r
- <buildCommand>\r
- <name>org.eclipse.jdt.core.javabuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- <buildCommand>\r
- <name>org.eclipse.pde.ManifestBuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- <buildCommand>\r
- <name>org.eclipse.pde.SchemaBuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- </buildSpec>\r
- <natures>\r
- <nature>org.eclipse.pde.PluginNature</nature>\r
- <nature>org.eclipse.jdt.core.javanature</nature>\r
- </natures>\r
-</projectDescription>\r
+++ /dev/null
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: G3D Plug-in
-Bundle-SymbolicName: org.simantics.g3d;singleton:=true
-Bundle-Version: 0.0.1.qualifier
-Bundle-Activator: org.simantics.proconf.g3d.Activator
-Bundle-Vendor: VTT Technical Research Center of Finland
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- javax.vecmath,
- com.jme.eclipse,
- org.simantics.proconf.image,
- org.eclipse.ui.views,
- org.simantics.db,
- org.simantics.layer0,
- org.simantics.layer0.utils,
- org.simantics.image.stubs,
- org.simantics.utils,
- org.simantics.utils.datastructures,
- org.simantics.utils.ui,
- org.simantics.ui,
- org.simantics.equation,
- org.simantics.proconf.browsing,
- org.eclipse.ui.forms,
- org.eclipse.core.expressions,
- org.simantics.animation
-Eclipse-LazyStart: true
-Export-Package: org.simantics.proconf.g3d.actions,
- org.simantics.proconf.g3d.animation,
- org.simantics.proconf.g3d.animation.ui,
- org.simantics.proconf.g3d.base,
- org.simantics.proconf.g3d.common,
- org.simantics.proconf.g3d.dialogs,
- org.simantics.proconf.g3d.dnd,
- org.simantics.proconf.g3d.gizmo,
- org.simantics.proconf.g3d.input,
- org.simantics.proconf.g3d.preferences,
- org.simantics.proconf.g3d.scenegraph,
- org.simantics.proconf.g3d.shapes,
- org.simantics.proconf.g3d.stubs,
- org.simantics.proconf.g3d.tools,
- org.simantics.proconf.g3d.views
+++ /dev/null
-source.. = src/\r
-output.. = bin/\r
-bin.includes = META-INF/,\\r
- .,\\r
- plugin.xml\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<!-- Created with Inkscape (http://www.inkscape.org/) -->\r
-<svg\r
- xmlns:dc="http://purl.org/dc/elements/1.1/"\r
- xmlns:cc="http://web.resource.org/cc/"\r
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"\r
- xmlns:svg="http://www.w3.org/2000/svg"\r
- xmlns="http://www.w3.org/2000/svg"\r
- xmlns:xlink="http://www.w3.org/1999/xlink"\r
- xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"\r
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"\r
- width="744.09448819"\r
- height="1052.3622047"\r
- id="svg2"\r
- sodipodi:version="0.32"\r
- inkscape:version="0.43"\r
- sodipodi:docbase="D:\workspace\fi.vtt.proconf.webmon.visualizations.binary\icons"\r
- sodipodi:docname="binary.svg"\r
- inkscape:export-filename="D:\binary.png"\r
- inkscape:export-xdpi="14.400002"\r
- inkscape:export-ydpi="14.400002">\r
- <defs\r
- id="defs4">\r
- <linearGradient\r
- id="linearGradient1308">\r
- <stop\r
- style="stop-color:#ffffff;stop-opacity:1.0000000;"\r
- offset="0.00000000"\r
- id="stop1310" />\r
- <stop\r
- style="stop-color:#5764ff;stop-opacity:1.0000000;"\r
- offset="1.0000000"\r
- id="stop1312" />\r
- </linearGradient>\r
- <radialGradient\r
- inkscape:collect="always"\r
- xlink:href="#linearGradient1308"\r
- id="radialGradient1316"\r
- cx="105.42004"\r
- cy="96.950104"\r
- fx="105.42004"\r
- fy="96.950104"\r
- r="50.500000"\r
- gradientUnits="userSpaceOnUse"\r
- gradientTransform="matrix(0.892809,1.055631,-0.763525,0.645779,74.50455,-84.48377)" />\r
- </defs>\r
- <sodipodi:namedview\r
- id="base"\r
- pagecolor="#ffffff"\r
- bordercolor="#666666"\r
- borderopacity="1.0"\r
- inkscape:pageopacity="0.0"\r
- inkscape:pageshadow="2"\r
- inkscape:zoom="7.2970297"\r
- inkscape:cx="107.14286"\r
- inkscape:cy="947.14286"\r
- inkscape:document-units="px"\r
- inkscape:current-layer="layer1"\r
- inkscape:window-width="1280"\r
- inkscape:window-height="904"\r
- inkscape:window-x="149"\r
- inkscape:window-y="34" />\r
- <metadata\r
- id="metadata7">\r
- <rdf:RDF>\r
- <cc:Work\r
- rdf:about="">\r
- <dc:format>image/svg+xml</dc:format>\r
- <dc:type\r
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />\r
- </cc:Work>\r
- </rdf:RDF>\r
- </metadata>\r
- <g\r
- inkscape:label="Layer 1"\r
- inkscape:groupmode="layer"\r
- id="layer1">\r
- <path\r
- sodipodi:type="arc"\r
- style="fill:url(#radialGradient1316);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"\r
- id="path1306"\r
- sodipodi:cx="107.14286"\r
- sodipodi:cy="105.21932"\r
- sodipodi:rx="50.000000"\r
- sodipodi:ry="50.000000"\r
- d="M 157.14286 105.21932 A 50.000000 50.000000 0 1 1 57.142860,105.21932 A 50.000000 50.000000 0 1 1 157.14286 105.21932 z" />\r
- <text\r
- xml:space="preserve"\r
- style="font-size:93.40623474px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"\r
- x="71.08165"\r
- y="144.76363"\r
- id="text1318"\r
- sodipodi:linespacing="125%"\r
- transform="scale(1.0468,0.955293)"><tspan\r
- sodipodi:role="line"\r
- id="tspan1311"\r
- x="71.08165"\r
- y="144.76363">B</tspan></text>\r
- </g>\r
-</svg>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="100"
- height="100"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- version="1.0"
- sodipodi:docname="delete.svg"
- sodipodi:docbase="D:\dev\icons"
- inkscape:export-filename="D:\dev\icons\Nozzle.png"
- inkscape:export-xdpi="14.4"
- inkscape:export-ydpi="14.4">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient3686">
- <stop
- style="stop-color:red;stop-opacity:0;"
- offset="0"
- id="stop3688" />
- <stop
- style="stop-color:red;stop-opacity:1;"
- offset="1"
- id="stop3690" />
- </linearGradient>
- <linearGradient
- id="linearGradient3133">
- <stop
- style="stop-color:#4c4c4c;stop-opacity:1;"
- offset="0"
- id="stop3135" />
- <stop
- id="stop3141"
- offset="0.5"
- style="stop-color:#cbcbcb;stop-opacity:1;" />
- <stop
- style="stop-color:#4c4c4c;stop-opacity:1;"
- offset="1"
- id="stop3137" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3686"
- id="radialGradient3692"
- cx="50"
- cy="50"
- fx="50"
- fy="50"
- r="52"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.707107,-0.707107,0.707107,0.707107,-20.71068,50)" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="7.72"
- inkscape:cx="50"
- inkscape:cy="55.181347"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- width="100px"
- height="100px"
- inkscape:window-width="1280"
- inkscape:window-height="968"
- inkscape:window-x="-4"
- inkscape:window-y="-4" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <path
- style="fill:url(#radialGradient3692);fill-opacity:1;stroke:red;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="M 7.5735931,21.715729 L 35.857864,50 L 7.5735931,78.284271 L 21.715729,92.426407 L 50,64.142136 L 78.284271,92.426407 L 92.426407,78.284271 L 64.142136,50 L 92.426407,21.715729 L 78.284271,7.5735931 L 50,35.857864 L 21.715729,7.5735931 L 7.5735931,21.715729 z "
- id="rect2796" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="100"
- height="100"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- version="1.0"
- sodipodi:docname="eye.svg"
- sodipodi:docbase="D:\dev\icons"
- inkscape:export-filename="D:\dev\icons\eye.png"
- inkscape:export-xdpi="14.4"
- inkscape:export-ydpi="14.4">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient4583">
- <stop
- style="stop-color:#0049ff;stop-opacity:1;"
- offset="0"
- id="stop4585" />
- <stop
- style="stop-color:#00b3b3;stop-opacity:1;"
- offset="1"
- id="stop4587" />
- </linearGradient>
- <linearGradient
- id="linearGradient3686">
- <stop
- style="stop-color:red;stop-opacity:0;"
- offset="0"
- id="stop3688" />
- <stop
- style="stop-color:red;stop-opacity:1;"
- offset="1"
- id="stop3690" />
- </linearGradient>
- <linearGradient
- id="linearGradient3133">
- <stop
- style="stop-color:#4c4c4c;stop-opacity:1;"
- offset="0"
- id="stop3135" />
- <stop
- id="stop3141"
- offset="0.5"
- style="stop-color:#cbcbcb;stop-opacity:1;" />
- <stop
- style="stop-color:#4c4c4c;stop-opacity:1;"
- offset="1"
- id="stop3137" />
- </linearGradient>
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="10"
- inkscape:cx="50"
- inkscape:cy="59.95985"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- width="100px"
- height="100px"
- inkscape:window-width="1280"
- inkscape:window-height="968"
- inkscape:window-x="-4"
- inkscape:window-y="-4" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <path
- style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
- d="M 10,50 C 35.054042,24.945958 64.998554,24.998554 90,50 C 65.010416,74.989584 35.029348,75.029348 10,50 z "
- id="path3694"
- sodipodi:nodetypes="ccc" />
- <path
- sodipodi:type="arc"
- style="fill:#009bff;fill-opacity:1;stroke:#009aff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path3696"
- sodipodi:cx="50"
- sodipodi:cy="50"
- sodipodi:rx="15"
- sodipodi:ry="15"
- d="M 65 50 A 15 15 0 1 1 35,50 A 15 15 0 1 1 65 50 z" />
- <path
- sodipodi:type="arc"
- style="fill:black;fill-opacity:1;stroke:black;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path5476"
- sodipodi:cx="50"
- sodipodi:cy="50"
- sodipodi:rx="4"
- sodipodi:ry="4"
- d="M 54 50 A 4 4 0 1 1 46,50 A 4 4 0 1 1 54 50 z" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<!-- Created with Inkscape (http://www.inkscape.org/) -->\r
-<svg\r
- xmlns:dc="http://purl.org/dc/elements/1.1/"\r
- xmlns:cc="http://web.resource.org/cc/"\r
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"\r
- xmlns:svg="http://www.w3.org/2000/svg"\r
- xmlns="http://www.w3.org/2000/svg"\r
- xmlns:xlink="http://www.w3.org/1999/xlink"\r
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"\r
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"\r
- width="100"\r
- height="100"\r
- id="svg2"\r
- sodipodi:version="0.32"\r
- inkscape:version="0.44"\r
- version="1.0"\r
- sodipodi:docname="ff.svg"\r
- sodipodi:docbase="D:\dev\icons"\r
- inkscape:export-filename="D:\dev\icons\ff.png"\r
- inkscape:export-xdpi="14.4"\r
- inkscape:export-ydpi="14.4">\r
- <defs\r
- id="defs4">\r
- <linearGradient\r
- id="linearGradient6310">\r
- <stop\r
- style="stop-color:white;stop-opacity:1;"\r
- offset="0"\r
- id="stop6312" />\r
- <stop\r
- style="stop-color:blue;stop-opacity:1;"\r
- offset="1"\r
- id="stop6314" />\r
- </linearGradient>\r
- <linearGradient\r
- id="linearGradient3686">\r
- <stop\r
- style="stop-color:red;stop-opacity:0;"\r
- offset="0"\r
- id="stop3688" />\r
- <stop\r
- style="stop-color:red;stop-opacity:1;"\r
- offset="1"\r
- id="stop3690" />\r
- </linearGradient>\r
- <linearGradient\r
- id="linearGradient3133">\r
- <stop\r
- style="stop-color:#4c4c4c;stop-opacity:1;"\r
- offset="0"\r
- id="stop3135" />\r
- <stop\r
- id="stop3141"\r
- offset="0.5"\r
- style="stop-color:#cbcbcb;stop-opacity:1;" />\r
- <stop\r
- style="stop-color:#4c4c4c;stop-opacity:1;"\r
- offset="1"\r
- id="stop3137" />\r
- </linearGradient>\r
- <radialGradient\r
- inkscape:collect="always"\r
- xlink:href="#linearGradient6310"\r
- id="radialGradient6316"\r
- cx="63.25"\r
- cy="49.999989"\r
- fx="63.25"\r
- fy="49.999989"\r
- r="20.5"\r
- gradientTransform="matrix(0.768293,5.919238e-8,-1.428134e-7,1.853659,14.65549,-42.68293)"\r
- gradientUnits="userSpaceOnUse" />\r
- <radialGradient\r
- inkscape:collect="always"\r
- xlink:href="#linearGradient6310"\r
- id="radialGradient6318"\r
- cx="29"\r
- cy="49.999989"\r
- fx="29"\r
- fy="49.999989"\r
- r="20.5"\r
- gradientTransform="matrix(0.780488,9.067778e-7,-2.068587e-6,1.780488,6.365957,-39.02442)"\r
- gradientUnits="userSpaceOnUse" />\r
- </defs>\r
- <sodipodi:namedview\r
- id="base"\r
- pagecolor="#ffffff"\r
- bordercolor="#666666"\r
- borderopacity="1.0"\r
- gridtolerance="10000"\r
- guidetolerance="10"\r
- objecttolerance="10"\r
- inkscape:pageopacity="0.0"\r
- inkscape:pageshadow="2"\r
- inkscape:zoom="4"\r
- inkscape:cx="50"\r
- inkscape:cy="40"\r
- inkscape:document-units="px"\r
- inkscape:current-layer="layer1"\r
- width="100px"\r
- height="100px"\r
- inkscape:window-width="1280"\r
- inkscape:window-height="968"\r
- inkscape:window-x="-4"\r
- inkscape:window-y="-4" />\r
- <metadata\r
- id="metadata7">\r
- <rdf:RDF>\r
- <cc:Work\r
- rdf:about="">\r
- <dc:format>image/svg+xml</dc:format>\r
- <dc:type\r
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />\r
- </cc:Work>\r
- </rdf:RDF>\r
- </metadata>\r
- <g\r
- inkscape:label="Layer 1"\r
- inkscape:groupmode="layer"\r
- id="layer1">\r
- <path\r
- style="fill:url(#radialGradient6316);fill-opacity:1.0;fill-rule:evenodd;stroke:blue;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"\r
- d="M 85,50 L 50,15 L 50,85 L 85,50 z "\r
- id="path4536" />\r
- <path\r
- style="fill:url(#radialGradient6318);fill-opacity:1.0;fill-rule:evenodd;stroke:blue;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"\r
- d="M 15.5,85 L 15,15 L 50,50 L 15.5,85 z "\r
- id="path4538" />\r
- </g>\r
-</svg>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="744.09448819"
- height="1052.3622047"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- sodipodi:docbase="D:\dev\icons\jme"
- sodipodi:docname="geometry.svg"
- inkscape:export-filename="D:\dev\icons\jme\geometry.png"
- inkscape:export-xdpi="14.400002"
- inkscape:export-ydpi="14.400002">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient1308">
- <stop
- style="stop-color:#ffffff;stop-opacity:1.0000000;"
- offset="0.00000000"
- id="stop1310" />
- <stop
- style="stop-color:#00d51d;stop-opacity:1;"
- offset="1"
- id="stop1312" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1308"
- id="radialGradient1316"
- cx="105.42004"
- cy="96.950104"
- fx="105.42004"
- fy="96.950104"
- r="50.500000"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.892809,1.055631,-0.763525,0.645779,74.50455,-84.48377)" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="7.2970297"
- inkscape:cx="107.14286"
- inkscape:cy="947.14286"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- inkscape:window-width="1280"
- inkscape:window-height="904"
- inkscape:window-x="149"
- inkscape:window-y="34" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <path
- sodipodi:type="arc"
- style="fill:url(#radialGradient1316);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
- id="path1306"
- sodipodi:cx="107.14286"
- sodipodi:cy="105.21932"
- sodipodi:rx="50.000000"
- sodipodi:ry="50.000000"
- d="M 157.14286 105.21932 A 50.000000 50.000000 0 1 1 57.142860,105.21932 A 50.000000 50.000000 0 1 1 157.14286 105.21932 z" />
- <text
- xml:space="preserve"
- style="font-size:93.40626526px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
- x="65.321404"
- y="144.90714"
- id="text1318"
- sodipodi:linespacing="125%"
- transform="scale(1.0468,0.955293)"><tspan
- sodipodi:role="line"
- id="tspan1876"
- x="65.321404"
- y="144.90714">G</tspan></text>
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="744.09448819"
- height="1052.3622047"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- sodipodi:docbase="D:\dev\icons\jme"
- sodipodi:docname="node.svg"
- inkscape:export-filename="D:\dev\icons\jme\node.png"
- inkscape:export-xdpi="14.400002"
- inkscape:export-ydpi="14.400002">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient1308">
- <stop
- style="stop-color:#ffffff;stop-opacity:1.0000000;"
- offset="0.00000000"
- id="stop1310" />
- <stop
- style="stop-color:red;stop-opacity:1;"
- offset="1"
- id="stop1312" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient1308"
- id="radialGradient1316"
- cx="105.42004"
- cy="96.950104"
- fx="105.42004"
- fy="96.950104"
- r="50.500000"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.892809,1.055631,-0.763525,0.645779,74.50455,-84.48377)" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="7.2970297"
- inkscape:cx="107.14286"
- inkscape:cy="947.14286"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- inkscape:window-width="1280"
- inkscape:window-height="904"
- inkscape:window-x="149"
- inkscape:window-y="34" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <path
- sodipodi:type="arc"
- style="fill:url(#radialGradient1316);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
- id="path1306"
- sodipodi:cx="107.14286"
- sodipodi:cy="105.21932"
- sodipodi:rx="50.000000"
- sodipodi:ry="50.000000"
- d="M 157.14286 105.21932 A 50.000000 50.000000 0 1 1 57.142860,105.21932 A 50.000000 50.000000 0 1 1 157.14286 105.21932 z" />
- <text
- xml:space="preserve"
- style="font-size:93.40623199;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial"
- x="71.08165"
- y="144.76363"
- id="text1318"
- sodipodi:linespacing="125%"
- transform="scale(1.0468,0.955293)"><tspan
- sodipodi:role="line"
- id="tspan1876"
- x="71.08165"
- y="144.76363">N</tspan></text>
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<!-- Created with Inkscape (http://www.inkscape.org/) -->\r
-<svg\r
- xmlns:dc="http://purl.org/dc/elements/1.1/"\r
- xmlns:cc="http://web.resource.org/cc/"\r
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"\r
- xmlns:svg="http://www.w3.org/2000/svg"\r
- xmlns="http://www.w3.org/2000/svg"\r
- xmlns:xlink="http://www.w3.org/1999/xlink"\r
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"\r
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"\r
- width="100"\r
- height="100"\r
- id="svg2"\r
- sodipodi:version="0.32"\r
- inkscape:version="0.44"\r
- version="1.0"\r
- inkscape:export-filename="D:\dev\icons\play.png"\r
- inkscape:export-xdpi="14"\r
- inkscape:export-ydpi="14"\r
- sodipodi:docname="play.svg"\r
- sodipodi:docbase="D:\dev\icons">\r
- <defs\r
- id="defs4">\r
- <linearGradient\r
- id="linearGradient2184">\r
- <stop\r
- style="stop-color:white;stop-opacity:1;"\r
- offset="0"\r
- id="stop2186" />\r
- <stop\r
- style="stop-color:#2aae3a;stop-opacity:1;"\r
- offset="1"\r
- id="stop2188" />\r
- </linearGradient>\r
- <linearGradient\r
- id="linearGradient3146">\r
- <stop\r
- style="stop-color:#0000ff;stop-opacity:1;"\r
- offset="0"\r
- id="stop3148" />\r
- <stop\r
- id="stop3156"\r
- offset="0.5"\r
- style="stop-color:#006eff;stop-opacity:1;" />\r
- <stop\r
- style="stop-color:#00ffff;stop-opacity:1;"\r
- offset="0.75"\r
- id="stop3158" />\r
- <stop\r
- style="stop-color:#0079ff;stop-opacity:1;"\r
- offset="1"\r
- id="stop3150" />\r
- </linearGradient>\r
- <linearGradient\r
- inkscape:collect="always"\r
- xlink:href="#linearGradient2184"\r
- id="linearGradient2190"\r
- x1="8.00577"\r
- y1="50.15"\r
- x2="92.29423"\r
- y2="50.15"\r
- gradientUnits="userSpaceOnUse" />\r
- <radialGradient\r
- inkscape:collect="always"\r
- xlink:href="#linearGradient2184"\r
- id="radialGradient2795"\r
- cx="50"\r
- cy="50"\r
- fx="50"\r
- fy="50"\r
- r="40.5"\r
- gradientUnits="userSpaceOnUse" />\r
- <radialGradient\r
- inkscape:collect="always"\r
- xlink:href="#linearGradient2184"\r
- id="radialGradient5460"\r
- cx="41.099998"\r
- cy="49.999992"\r
- fx="41.099998"\r
- fy="49.999992"\r
- r="30.5"\r
- gradientTransform="matrix(0.724585,-2.263036e-7,3.286836e-7,1.055743,11.31954,-2.78713)"\r
- gradientUnits="userSpaceOnUse" />\r
- </defs>\r
- <sodipodi:namedview\r
- id="base"\r
- pagecolor="#ffffff"\r
- bordercolor="#666666"\r
- borderopacity="1.0"\r
- gridtolerance="10000"\r
- guidetolerance="10"\r
- objecttolerance="10"\r
- inkscape:pageopacity="0.0"\r
- inkscape:pageshadow="2"\r
- inkscape:zoom="10"\r
- inkscape:cx="50"\r
- inkscape:cy="58.310406"\r
- inkscape:document-units="px"\r
- inkscape:current-layer="layer1"\r
- width="100px"\r
- height="100px"\r
- inkscape:window-width="1272"\r
- inkscape:window-height="960"\r
- inkscape:window-x="0"\r
- inkscape:window-y="0" />\r
- <metadata\r
- id="metadata7">\r
- <rdf:RDF>\r
- <cc:Work\r
- rdf:about="">\r
- <dc:format>image/svg+xml</dc:format>\r
- <dc:type\r
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />\r
- </cc:Work>\r
- </rdf:RDF>\r
- </metadata>\r
- <g\r
- inkscape:label="Layer 1"\r
- inkscape:groupmode="layer"\r
- id="layer1">\r
- <path\r
- style="fill:url(#radialGradient5460);fill-opacity:1.0;fill-rule:evenodd;stroke:#009c00;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"\r
- d="M 80,50 L 20,10 L 20,90 L 80,50 z "\r
- id="path4567" />\r
- </g>\r
-</svg>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="100"
- height="100"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.43"
- version="1.0"
- inkscape:export-filename="C:\Documents and Settings\Make\Desktop\rotate.png"
- inkscape:export-xdpi="14"
- inkscape:export-ydpi="14"
- sodipodi:docname="rotate.svg"
- sodipodi:docbase="C:\Documents and Settings\Make\Desktop">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient2184">
- <stop
- style="stop-color:#2aae3a;stop-opacity:1;"
- offset="0"
- id="stop2186" />
- <stop
- style="stop-color:#2aae3a;stop-opacity:0;"
- offset="1"
- id="stop2188" />
- </linearGradient>
- <linearGradient
- id="linearGradient3146">
- <stop
- style="stop-color:#0000ff;stop-opacity:1;"
- offset="0"
- id="stop3148" />
- <stop
- id="stop3156"
- offset="0.5"
- style="stop-color:#006eff;stop-opacity:1;" />
- <stop
- style="stop-color:#00ffff;stop-opacity:1;"
- offset="0.75"
- id="stop3158" />
- <stop
- style="stop-color:#0079ff;stop-opacity:1;"
- offset="1"
- id="stop3150" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2184"
- id="linearGradient2190"
- x1="8.00577"
- y1="50.15"
- x2="92.29423"
- y2="50.15"
- gradientUnits="userSpaceOnUse" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="10"
- inkscape:cx="50"
- inkscape:cy="52.718966"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- width="100px"
- height="100px"
- inkscape:window-width="1680"
- inkscape:window-height="994"
- inkscape:window-x="1280"
- inkscape:window-y="22" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <path
- style="fill:url(#linearGradient2190);fill-opacity:1.0;fill-rule:nonzero;stroke:#009c00;stroke-width:4;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- d="M 50.15,10.00577 C 27.990385,10.00577 10.00577,27.990385 10.00577,50.15 C 10.00577,72.309615 27.990385,90.29423 50.15,90.29423 C 61.229808,90.29423 71.260847,85.793059 78.526954,78.526954 L 64.351021,64.351021 C 60.717969,67.984074 55.689904,70.222115 50.15,70.222115 C 39.070192,70.222115 30.077885,61.229808 30.077885,50.15 C 30.077885,39.070192 39.070192,30.077885 50.15,30.077885 C 55.689904,30.077885 60.717969,32.315926 64.351021,35.948979 L 50.15,50.15 L 90.29423,50.15 L 90.29423,10.00577 L 78.526954,21.773046 C 71.260847,14.506941 61.229808,10.00577 50.15,10.00577 z "
- id="path2162"
- inkscape:export-xdpi="14"
- inkscape:export-ydpi="14" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<!-- Created with Inkscape (http://www.inkscape.org/) -->\r
-<svg\r
- xmlns:dc="http://purl.org/dc/elements/1.1/"\r
- xmlns:cc="http://web.resource.org/cc/"\r
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"\r
- xmlns:svg="http://www.w3.org/2000/svg"\r
- xmlns="http://www.w3.org/2000/svg"\r
- xmlns:xlink="http://www.w3.org/1999/xlink"\r
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"\r
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"\r
- width="100"\r
- height="100"\r
- id="svg2"\r
- sodipodi:version="0.32"\r
- inkscape:version="0.44"\r
- version="1.0"\r
- sodipodi:docname="rw.svg"\r
- sodipodi:docbase="D:\dev\icons"\r
- inkscape:export-filename="D:\dev\icons\rw.png"\r
- inkscape:export-xdpi="14.4"\r
- inkscape:export-ydpi="14.4">\r
- <defs\r
- id="defs4">\r
- <linearGradient\r
- id="linearGradient6310">\r
- <stop\r
- style="stop-color:white;stop-opacity:1;"\r
- offset="0"\r
- id="stop6312" />\r
- <stop\r
- style="stop-color:blue;stop-opacity:1;"\r
- offset="1"\r
- id="stop6314" />\r
- </linearGradient>\r
- <linearGradient\r
- id="linearGradient3686">\r
- <stop\r
- style="stop-color:red;stop-opacity:0;"\r
- offset="0"\r
- id="stop3688" />\r
- <stop\r
- style="stop-color:red;stop-opacity:1;"\r
- offset="1"\r
- id="stop3690" />\r
- </linearGradient>\r
- <linearGradient\r
- id="linearGradient3133">\r
- <stop\r
- style="stop-color:#4c4c4c;stop-opacity:1;"\r
- offset="0"\r
- id="stop3135" />\r
- <stop\r
- id="stop3141"\r
- offset="0.5"\r
- style="stop-color:#cbcbcb;stop-opacity:1;" />\r
- <stop\r
- style="stop-color:#4c4c4c;stop-opacity:1;"\r
- offset="1"\r
- id="stop3137" />\r
- </linearGradient>\r
- <radialGradient\r
- inkscape:collect="always"\r
- xlink:href="#linearGradient6310"\r
- id="radialGradient6316"\r
- cx="63.25"\r
- cy="49.999989"\r
- fx="63.25"\r
- fy="49.999989"\r
- r="20.5"\r
- gradientTransform="matrix(-0.768293,-5.919238e-8,1.428134e-7,-1.853659,85.34451,142.6829)"\r
- gradientUnits="userSpaceOnUse" />\r
- <radialGradient\r
- inkscape:collect="always"\r
- xlink:href="#linearGradient6310"\r
- id="radialGradient6318"\r
- cx="29"\r
- cy="49.999989"\r
- fx="29"\r
- fy="49.999989"\r
- r="20.5"\r
- gradientTransform="matrix(-0.780488,-9.067778e-7,2.068587e-6,-1.780488,93.63404,139.0244)"\r
- gradientUnits="userSpaceOnUse" />\r
- </defs>\r
- <sodipodi:namedview\r
- id="base"\r
- pagecolor="#ffffff"\r
- bordercolor="#666666"\r
- borderopacity="1.0"\r
- gridtolerance="10000"\r
- guidetolerance="10"\r
- objecttolerance="10"\r
- inkscape:pageopacity="0.0"\r
- inkscape:pageshadow="2"\r
- inkscape:zoom="4"\r
- inkscape:cx="50"\r
- inkscape:cy="40"\r
- inkscape:document-units="px"\r
- inkscape:current-layer="layer1"\r
- width="100px"\r
- height="100px"\r
- inkscape:window-width="1280"\r
- inkscape:window-height="968"\r
- inkscape:window-x="-4"\r
- inkscape:window-y="-4" />\r
- <metadata\r
- id="metadata7">\r
- <rdf:RDF>\r
- <cc:Work\r
- rdf:about="">\r
- <dc:format>image/svg+xml</dc:format>\r
- <dc:type\r
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />\r
- </cc:Work>\r
- </rdf:RDF>\r
- </metadata>\r
- <g\r
- inkscape:label="Layer 1"\r
- inkscape:groupmode="layer"\r
- id="layer1">\r
- <path\r
- style="fill:url(#radialGradient6316);fill-opacity:1;fill-rule:evenodd;stroke:blue;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"\r
- d="M 15,50 L 50,85 L 50,15 L 15,50 z "\r
- id="path4536" />\r
- <path\r
- style="fill:url(#radialGradient6318);fill-opacity:1;fill-rule:evenodd;stroke:blue;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"\r
- d="M 84.5,15 L 85,85 L 50,50 L 84.5,15 z "\r
- id="path4538" />\r
- </g>\r
-</svg>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<!-- Created with Inkscape (http://www.inkscape.org/) -->\r
-<svg\r
- xmlns:dc="http://purl.org/dc/elements/1.1/"\r
- xmlns:cc="http://web.resource.org/cc/"\r
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"\r
- xmlns:svg="http://www.w3.org/2000/svg"\r
- xmlns="http://www.w3.org/2000/svg"\r
- xmlns:xlink="http://www.w3.org/1999/xlink"\r
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"\r
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"\r
- width="100"\r
- height="100"\r
- id="svg2"\r
- sodipodi:version="0.32"\r
- inkscape:version="0.44"\r
- version="1.0"\r
- sodipodi:docname="stop.svg"\r
- sodipodi:docbase="D:\dev\icons"\r
- inkscape:export-filename="D:\dev\icons\stop.png"\r
- inkscape:export-xdpi="14.4"\r
- inkscape:export-ydpi="14.4">\r
- <defs\r
- id="defs4">\r
- <linearGradient\r
- id="linearGradient3686">\r
- <stop\r
- style="stop-color:white;stop-opacity:1;"\r
- offset="0"\r
- id="stop3688" />\r
- <stop\r
- style="stop-color:red;stop-opacity:1;"\r
- offset="1"\r
- id="stop3690" />\r
- </linearGradient>\r
- <linearGradient\r
- id="linearGradient3133">\r
- <stop\r
- style="stop-color:#4c4c4c;stop-opacity:1;"\r
- offset="0"\r
- id="stop3135" />\r
- <stop\r
- id="stop3141"\r
- offset="0.5"\r
- style="stop-color:#cbcbcb;stop-opacity:1;" />\r
- <stop\r
- style="stop-color:#4c4c4c;stop-opacity:1;"\r
- offset="1"\r
- id="stop3137" />\r
- </linearGradient>\r
- <radialGradient\r
- inkscape:collect="always"\r
- xlink:href="#linearGradient3686"\r
- id="radialGradient3657"\r
- cx="50"\r
- cy="50"\r
- fx="50"\r
- fy="50"\r
- r="42"\r
- gradientUnits="userSpaceOnUse"\r
- gradientTransform="matrix(1.366955,0,0,1.366953,-18.34766,-18.34764)" />\r
- </defs>\r
- <sodipodi:namedview\r
- id="base"\r
- pagecolor="#ffffff"\r
- bordercolor="#666666"\r
- borderopacity="1.0"\r
- gridtolerance="10000"\r
- guidetolerance="10"\r
- objecttolerance="10"\r
- inkscape:pageopacity="0.0"\r
- inkscape:pageshadow="2"\r
- inkscape:zoom="7.72"\r
- inkscape:cx="50"\r
- inkscape:cy="50"\r
- inkscape:document-units="px"\r
- inkscape:current-layer="layer1"\r
- width="100px"\r
- height="100px"\r
- inkscape:window-width="1280"\r
- inkscape:window-height="968"\r
- inkscape:window-x="-4"\r
- inkscape:window-y="-4" />\r
- <metadata\r
- id="metadata7">\r
- <rdf:RDF>\r
- <cc:Work\r
- rdf:about="">\r
- <dc:format>image/svg+xml</dc:format>\r
- <dc:type\r
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />\r
- </cc:Work>\r
- </rdf:RDF>\r
- </metadata>\r
- <g\r
- inkscape:label="Layer 1"\r
- inkscape:groupmode="layer"\r
- id="layer1">\r
- <path\r
- style="fill:url(#radialGradient3657);fill-opacity:1;fill-rule:evenodd;stroke:red;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"\r
- d="M 17.619764,17.619763 L 17.619764,82.380236 L 82.380236,82.380236 L 82.380236,17.619763 L 17.619764,17.619763 z "\r
- id="path1878" />\r
- </g>\r
-</svg>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="100"
- height="100"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- version="1.0"
- inkscape:export-filename="C:\Documents and Settings\Make\Desktop\rotate.png"
- inkscape:export-xdpi="14"
- inkscape:export-ydpi="14"
- sodipodi:docname="translate.svg"
- sodipodi:docbase="D:\dev\icons">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient2184">
- <stop
- style="stop-color:#2aae3a;stop-opacity:1;"
- offset="0"
- id="stop2186" />
- <stop
- style="stop-color:#2aae3a;stop-opacity:0;"
- offset="1"
- id="stop2188" />
- </linearGradient>
- <linearGradient
- id="linearGradient3146">
- <stop
- style="stop-color:#0000ff;stop-opacity:1;"
- offset="0"
- id="stop3148" />
- <stop
- id="stop3156"
- offset="0.5"
- style="stop-color:#006eff;stop-opacity:1;" />
- <stop
- style="stop-color:#00ffff;stop-opacity:1;"
- offset="0.75"
- id="stop3158" />
- <stop
- style="stop-color:#0079ff;stop-opacity:1;"
- offset="1"
- id="stop3150" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2184"
- id="linearGradient2190"
- x1="8.00577"
- y1="50.15"
- x2="92.29423"
- y2="50.15"
- gradientUnits="userSpaceOnUse" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2184"
- id="radialGradient4579"
- cx="50"
- cy="50"
- fx="50"
- fy="50"
- r="52"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.809436,0,0,0.809436,9.463433,9.592966)" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="7.72"
- inkscape:cx="50"
- inkscape:cy="39.637306"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- width="100px"
- height="100px"
- inkscape:window-width="1280"
- inkscape:window-height="968"
- inkscape:window-x="-4"
- inkscape:window-y="-4" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <path
- style="fill:url(#radialGradient4579);fill-opacity:1;fill-rule:evenodd;stroke:#009c00;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 49.935233,9.5929652 L 33.746512,25.781686 L 41.840873,25.781686 L 41.840873,41.970406 L 25.652153,41.970406 L 25.652153,33.876046 L 9.4634316,50.064767 L 25.652153,66.253488 L 25.652153,58.159127 L 41.840873,58.159127 L 41.840873,74.347847 L 33.746512,74.347847 L 49.935233,90.536568 L 66.123954,74.347847 L 58.029594,74.347847 L 58.029594,58.159127 L 74.218314,58.159127 L 74.218314,66.253488 L 90.407036,50.064767 L 74.218314,33.876046 L 74.218314,41.970406 L 58.029594,41.970406 L 58.029594,25.781686 L 66.123954,25.781686 L 49.935233,9.5929652 z "
- id="path1879" />
- </g>
-</svg>
+++ /dev/null
-############################################################\r
-# Default Logging Configuration File\r
-#\r
-# You can use a different file by specifying a filename\r
-# with the java.util.logging.config.file system property. \r
-# For example java -Djava.util.logging.config.file=myfile\r
-############################################################\r
-\r
-############################################################\r
-# Global properties\r
-############################################################\r
-\r
-# "handlers" specifies a comma separated list of log Handler \r
-# classes. These handlers will be installed during VM startup.\r
-# Note that these classes must be on the system classpath.\r
-# By default we only configure a ConsoleHandler, which will only\r
-# show messages at the INFO and above levels.\r
-handlers= java.util.logging.ConsoleHandler\r
-\r
-# To also add the FileHandler, use the following line instead.\r
-#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler\r
-\r
-# Default global logging level.\r
-# This specifies which kinds of events are logged across\r
-# all loggers. For any given facility this global level\r
-# can be overriden by a facility specific level\r
-# Note that the ConsoleHandler also has a separate level\r
-# setting to limit messages printed to the console.\r
-.level= OFF\r
-\r
-############################################################\r
-# Handler specific properties.\r
-# Describes specific configuration info for Handlers.\r
-############################################################\r
-\r
-# default file output is in user's home directory.\r
-java.util.logging.FileHandler.pattern = %h/java%u.log\r
-java.util.logging.FileHandler.limit = 50000\r
-java.util.logging.FileHandler.count = 1\r
-java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter\r
-\r
-# Limit the message that are printed on the console to INFO and above.\r
-java.util.logging.ConsoleHandler.level = OFF\r
-java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter\r
-\r
-\r
-############################################################\r
-# Facility specific properties.\r
-# Provides extra control for each logger.\r
-############################################################\r
-\r
-# For example, set the com.xyz.foo logger to only log SEVERE\r
-# messages:\r
-# com.xyz.foo.level = SEVERE\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<?eclipse version="3.2"?>\r
-<plugin>\r
- <extension-point id="geometry" name="Geometry" schema="schema/geometry.exsd"/>\r
- <extension-point id="appearance" name="Appearance" schema="schema/appearance.exsd"/>\r
- <extension\r
- point="org.eclipse.ui.preferencePages">\r
- <page\r
- category="org.simantics.proconf.preferences"\r
- class="org.simantics.proconf.g3d.preferences.G3DPreferencesPage"\r
- id="fi.vtt.simantics.g3d.page1"\r
- name="3D Preferences">\r
- </page>\r
- </extension>\r
- <extension\r
- point="org.eclipse.core.runtime.preferences">\r
- <initializer\r
- class="org.simantics.proconf.g3d.preferences.PreferenceInitializer">\r
- </initializer>\r
- </extension>\r
- <extension\r
- point="org.eclipse.ui.views">\r
- <view\r
- allowMultiple="false"\r
- class="org.simantics.proconf.g3d.views.ScenegraphViewPart"\r
- icon="icons/geometry.png"\r
- id="org.simantics.g3d.views.scenegraph"\r
- name="Scene-graph">\r
- </view>\r
- <view\r
- allowMultiple="false"\r
- class="org.simantics.proconf.g3d.views.AppearanceEditor"\r
- icon="icons/geometry.png"\r
- id="org.simantics.proconf.g3d.view1"\r
- name="Appearance Editor">\r
- </view>\r
- </extension>\r
- <extension\r
- point="org.eclipse.core.expressions.propertyTesters">\r
- <propertyTester\r
- class="org.simantics.proconf.g3d.common.PropertyTester2"\r
- id="org.simantics.proconf.editorToolTester"\r
- namespace="org.simantics.proconf"\r
- properties="editorTool"\r
- type="org.eclipse.jface.viewers.IStructuredSelection">\r
- </propertyTester>\r
- </extension>\r
- <extension\r
- point="org.simantics.proconf.g3d.appearance">\r
- <Appearance\r
- class="org.simantics.proconf.g3d.base.DefaultAppearanceProvider"\r
- id="org.simantics.proconf.g3d.Appearance1">\r
- </Appearance>\r
- </extension>\r
-</plugin>\r
+++ /dev/null
-<?xml version='1.0' encoding='UTF-8'?>\r
-<!-- Schema file written by PDE -->\r
-<schema targetNamespace="org.simantics.proconf.g3d" xmlns="http://www.w3.org/2001/XMLSchema">\r
-<annotation>\r
- <appinfo>\r
- <meta.schema plugin="org.simantics.proconf.g3d" id="appearance" name="appearance"/>\r
- </appinfo>\r
- <documentation>\r
- [Enter description of this extension point.]\r
- </documentation>\r
- </annotation>\r
-\r
- <element name="extension">\r
- <annotation>\r
- <appinfo>\r
- <meta.element />\r
- </appinfo>\r
- </annotation>\r
- <complexType>\r
- <sequence>\r
- <element ref="Appearance" minOccurs="0" maxOccurs="unbounded"/>\r
- </sequence>\r
- <attribute name="point" type="string" use="required">\r
- <annotation>\r
- <documentation>\r
- \r
- </documentation>\r
- </annotation>\r
- </attribute>\r
- <attribute name="id" type="string">\r
- <annotation>\r
- <documentation>\r
- \r
- </documentation>\r
- </annotation>\r
- </attribute>\r
- <attribute name="name" type="string">\r
- <annotation>\r
- <documentation>\r
- \r
- </documentation>\r
- <appinfo>\r
- <meta.attribute translatable="true"/>\r
- </appinfo>\r
- </annotation>\r
- </attribute>\r
- </complexType>\r
- </element>\r
-\r
- <element name="Appearance">\r
- <complexType>\r
- <attribute name="id" type="string" use="required">\r
- <annotation>\r
- <documentation>\r
- \r
- </documentation>\r
- </annotation>\r
- </attribute>\r
- <attribute name="class" type="string" use="required">\r
- <annotation>\r
- <documentation>\r
- \r
- </documentation>\r
- <appinfo>\r
- <meta.attribute kind="java" basedOn=":org.simantics.proconf.g3d.base.AppearanceProvider"/>\r
- </appinfo>\r
- </annotation>\r
- </attribute>\r
- </complexType>\r
- </element>\r
-\r
- <annotation>\r
- <appinfo>\r
- <meta.section type="since"/>\r
- </appinfo>\r
- <documentation>\r
- [Enter the first release in which this extension point appears.]\r
- </documentation>\r
- </annotation>\r
-\r
- <annotation>\r
- <appinfo>\r
- <meta.section type="examples"/>\r
- </appinfo>\r
- <documentation>\r
- [Enter extension point usage example here.]\r
- </documentation>\r
- </annotation>\r
-\r
- <annotation>\r
- <appinfo>\r
- <meta.section type="apiinfo"/>\r
- </appinfo>\r
- <documentation>\r
- [Enter API information here.]\r
- </documentation>\r
- </annotation>\r
-\r
- <annotation>\r
- <appinfo>\r
- <meta.section type="implementation"/>\r
- </appinfo>\r
- <documentation>\r
- [Enter information about supplied implementation of this extension point.]\r
- </documentation>\r
- </annotation>\r
-\r
-\r
-</schema>\r
+++ /dev/null
-<?xml version='1.0' encoding='UTF-8'?>\r
-<!-- Schema file written by PDE -->\r
-<schema targetNamespace="org.simantics.proconf.g3d" xmlns="http://www.w3.org/2001/XMLSchema">\r
-<annotation>\r
- <appinfo>\r
- <meta.schema plugin="org.simantics.proconf.g3d" id="geometry" name="Geometry"/>\r
- </appinfo>\r
- <documentation>\r
- [Enter description of this extension point.]\r
- </documentation>\r
- </annotation>\r
-\r
- <element name="extension">\r
- <annotation>\r
- <appinfo>\r
- <meta.element />\r
- </appinfo>\r
- </annotation>\r
- <complexType>\r
- <sequence>\r
- <element ref="Geometry" minOccurs="0" maxOccurs="unbounded"/>\r
- </sequence>\r
- <attribute name="point" type="string" use="required">\r
- <annotation>\r
- <documentation>\r
- \r
- </documentation>\r
- </annotation>\r
- </attribute>\r
- <attribute name="id" type="string">\r
- <annotation>\r
- <documentation>\r
- \r
- </documentation>\r
- </annotation>\r
- </attribute>\r
- <attribute name="name" type="string">\r
- <annotation>\r
- <documentation>\r
- \r
- </documentation>\r
- <appinfo>\r
- <meta.attribute translatable="true"/>\r
- </appinfo>\r
- </annotation>\r
- </attribute>\r
- </complexType>\r
- </element>\r
-\r
- <element name="Geometry">\r
- <complexType>\r
- <attribute name="id" type="string" use="required">\r
- <annotation>\r
- <documentation>\r
- \r
- </documentation>\r
- </annotation>\r
- </attribute>\r
- <attribute name="class" type="string" use="required">\r
- <annotation>\r
- <documentation>\r
- \r
- </documentation>\r
- <appinfo>\r
- <meta.attribute kind="java" basedOn=":org.simantics.proconf.g3d.base.GeometryProvider"/>\r
- </appinfo>\r
- </annotation>\r
- </attribute>\r
- </complexType>\r
- </element>\r
-\r
- <annotation>\r
- <appinfo>\r
- <meta.section type="since"/>\r
- </appinfo>\r
- <documentation>\r
- [Enter the first release in which this extension point appears.]\r
- </documentation>\r
- </annotation>\r
-\r
- <annotation>\r
- <appinfo>\r
- <meta.section type="examples"/>\r
- </appinfo>\r
- <documentation>\r
- [Enter extension point usage example here.]\r
- </documentation>\r
- </annotation>\r
-\r
- <annotation>\r
- <appinfo>\r
- <meta.section type="apiInfo"/>\r
- </appinfo>\r
- <documentation>\r
- [Enter API information here.]\r
- </documentation>\r
- </annotation>\r
-\r
- <annotation>\r
- <appinfo>\r
- <meta.section type="implementation"/>\r
- </appinfo>\r
- <documentation>\r
- [Enter information about supplied implementation of this extension point.]\r
- </documentation>\r
- </annotation>\r
-\r
-\r
-</schema>\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d;\r
-\r
-import org.eclipse.ui.plugin.AbstractUIPlugin;\r
-import org.osgi.framework.BundleContext;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.management.ISessionContext;\r
-import org.simantics.db.management.ISessionContextChangedListener;\r
-import org.simantics.db.management.SessionContextChangedEvent;\r
-import org.simantics.proconf.ui.ProConfUI;\r
-\r
-/**\r
- * The activator class controls the plug-in life cycle\r
- */\r
-public class Activator extends AbstractUIPlugin {\r
-\r
- // The plug-in ID\r
- public static final String PLUGIN_ID = "org.simantics.proconf.g3d";\r
-\r
- // The shared instance\r
- private static Activator plugin;\r
- \r
- /**\r
- * The constructor\r
- */\r
- public Activator() {\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)\r
- */\r
- public void start(BundleContext context) throws Exception {\r
- super.start(context);\r
- plugin = this;\r
- ProConfUI.getSessionContextProvider().addContextChangedListener(new ISessionContextChangedListener() {\r
- @Override\r
- public void sessionContextChanged(SessionContextChangedEvent event) {\r
- ISessionContext ctx = event.getNewValue();\r
- if (ctx != null) {\r
- ctx.getSession().asyncRead(new GraphRequestAdapter() {\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- Resources.initialize(g);\r
- return GraphRequestStatus.transactionComplete();\r
- };\r
- });\r
- } else {\r
- Resources.deinitialize();\r
- }\r
- }\r
- });\r
- try {\r
- ProConfUI.getSession().asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- Resources.initialize(g);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- } catch (Exception e) {\r
- \r
- }\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)\r
- */\r
- public void stop(BundleContext context) throws Exception {\r
- plugin = null;\r
- super.stop(context);\r
- }\r
-\r
- /**\r
- * Returns the shared instance\r
- *\r
- * @return the shared instance\r
- */\r
- public static Activator getDefault() {\r
- return plugin;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.equation.stubs.EquationResource;\r
-import org.simantics.animation.stubs.AnimationResource;\r
-import org.simantics.animation.curve.CurveBuilder;\r
-import org.simantics.animation.curve.CurveBuilderImpl;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.stubs.G3DResource;\r
-\r
-public class Resources {\r
- public static AnimationResource animationResource;\r
- public static G3DResource g3dResource;\r
- public static CurveBuilder curveBuilder;\r
- public static EquationResource equationResource;\r
- \r
- public static void initialize(Graph g) {\r
- animationResource = AnimationResource.getInstance(g);\r
- g3dResource = G3DResource.getInstance(g);\r
- curveBuilder = new CurveBuilderImpl(Resources.animationResource);\r
- equationResource = EquationResource.getInstance(g);\r
- G3DTools.initialize();\r
- }\r
- \r
- public static void deinitialize() {\r
- animationResource = null;\r
- g3dResource = null;\r
- curveBuilder = null;\r
- equationResource = null;\r
- G3DTools.deinitialize();\r
- }\r
- \r
- \r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.actions;\r
-\r
-import java.awt.event.KeyEvent;\r
-import java.awt.event.MouseEvent;\r
-import java.util.List;\r
-\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.proconf.g3d.base.JmeRenderingComponent;\r
-import org.simantics.proconf.g3d.base.MathTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.common.OrbitalCamera;\r
-\r
-\r
-\r
-public class CameraAction extends InteractiveAction{\r
- \r
- private JmeRenderingComponent component;\r
- private OrbitalCamera camera;\r
- \r
- public CameraAction(ThreeDimensionalEditorBase parent) {\r
- super(parent);\r
- component = parent.getRenderingComponent();\r
- camera = parent.getCamera();\r
- }\r
- \r
- @Override\r
- public void activate() {\r
-\r
- }\r
-\r
- @Override\r
- public void deactivate() {\r
-\r
- }\r
- \r
- @Override\r
- public boolean usable(Graph graph,List<Resource> resources) {\r
- return true;\r
- }\r
-\r
- Vector3d prevIntersectPoint = new Vector3d();\r
- @Override\r
- public void update() {\r
- double scale = 1.0;\r
- if (input.keyDown(KeyEvent.VK_CONTROL))\r
- scale = -1.0;\r
- if (input.keyPressed(KeyEvent.VK_NUMPAD5)) {\r
- if (component.getProjectionPolicy() == JmeRenderingComponent.PERSPECTIVE_PROJECTION)\r
- component.setProjectionPolicy(JmeRenderingComponent.PARALLEL_PROJECTION);\r
- else\r
- component.setProjectionPolicy(JmeRenderingComponent.PERSPECTIVE_PROJECTION);\r
- parent.setViewChanged(true);\r
- }\r
- if (input.keyPressed(KeyEvent.VK_NUMPAD7)) {\r
- camera.setCameraPosRelativeToTarget(new Vector3d(camera.getDistanceToTarget() * scale, 0, 0));\r
- parent.setViewChanged(true);\r
- }\r
- if (input.keyPressed(KeyEvent.VK_NUMPAD1)) {\r
- camera.setCameraPosRelativeToTarget(new Vector3d(0, 0, camera.getDistanceToTarget() * scale));\r
- parent.setViewChanged(true);\r
- }\r
- if (input.keyPressed(KeyEvent.VK_NUMPAD9)) {\r
- camera.setCameraPosRelativeToTarget(new Vector3d(0, camera.getDistanceToTarget() * scale, 0));\r
- parent.setViewChanged(true);\r
- }\r
-\r
- if (input.mousePressed() && ((input.pressModifiers() & MouseEvent.BUTTON1_MASK) > 0)) {\r
- Vector3d o = new Vector3d();\r
- Vector3d d = new Vector3d();\r
- parent.createPickRay(o, d);\r
- Vector3d point = new Vector3d(camera.getTarget());\r
- Vector3d normal = camera.getUnNormalizedHeading();\r
- normal.normalize();\r
- MathTools.intersectStraightPlane(o, d, point, normal, prevIntersectPoint);\r
- }\r
- if (!input.mouseDragged())\r
- return;\r
- parent.setViewChanged(true);\r
- Vector3d msTmp = new Vector3d();\r
- msTmp.x = (input.prevMouseX() - input.mouseX()) / 100f;\r
- msTmp.y = (input.prevMouseY() - input.mouseY()) / 100f;\r
-\r
- if ((input.dragModifiers() & MouseEvent.BUTTON1_MASK) > 0) {\r
- if ((input.dragModifiers() & MouseEvent.CTRL_MASK) > 0) {\r
- Vector3d o = new Vector3d();\r
- Vector3d d = new Vector3d();\r
- parent.createPickRay(o, d);\r
- Vector3d point = new Vector3d(camera.getTarget());\r
- Vector3d normal = camera.getUnNormalizedHeading();\r
- normal.normalize();\r
- Vector3d intersectPoint = new Vector3d();\r
- if (MathTools.intersectStraightPlane(o, d, point, normal, intersectPoint)) {\r
- Vector3d delta = new Vector3d(intersectPoint);\r
- delta.sub(prevIntersectPoint);\r
- prevIntersectPoint = intersectPoint;\r
- delta.negate();\r
- camera.translate(delta);\r
- prevIntersectPoint.add(delta);\r
- } else {\r
- camera.moveRight((float) msTmp.x);\r
- camera.moveUp(-(float) msTmp.y);\r
- }\r
- } else {\r
- camera.rotateRight((float) msTmp.x);\r
- camera.rotateUp((float) msTmp.y);\r
- }\r
- } else if ((input.dragModifiers() & MouseEvent.BUTTON2_MASK) > 0) {\r
- // System.out.println("zoom");\r
- if (component.getProjectionPolicy() == JmeRenderingComponent.PERSPECTIVE_PROJECTION) {\r
- camera.moveScaledToTarget((float) msTmp.y * 0.5f);\r
- } else {\r
- component.setScreenScale(component.getScreenScale() - (float) msTmp.y * 0.5f * component.getScreenScale());\r
- }\r
- }\r
-// } else {\r
-// System.out.println("cameraAction!");\r
-// System.out.println(input);\r
-// } \r
- \r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.actions;\r
-\r
-import java.util.List;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.eclipse.jface.resource.ImageDescriptor;\r
-import org.simantics.proconf.g3d.Activator;\r
-import org.simantics.proconf.g3d.base.ConstraintDetector;\r
-import org.simantics.proconf.g3d.base.JmeRenderingComponent;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.common.OrbitalCamera;\r
-\r
-\r
-public abstract class ConstrainedTransformAction extends WriteInteractiveAction {\r
- private static final ImageDescriptor LOCK_ICON = Activator.imageDescriptorFromPlugin("org.simantic.proconf.g3d", "icons/silk/lock.png");\r
- private static final ImageDescriptor LOCK_OPEN_ICON = Activator.imageDescriptorFromPlugin("org.simantic.proconf.g3d", "icons/silk/lock_open.png");\r
- \r
- protected JmeRenderingComponent component;\r
- protected OrbitalCamera camera;\r
- \r
- protected boolean useConstraints = false;\r
- protected ConstraintDetector detector;\r
- \r
- protected Action useConstraintsAction;\r
- \r
- //protected IToolBarManager manager;\r
- \r
- public ConstrainedTransformAction(ThreeDimensionalEditorBase editor) {\r
- super(editor, true);\r
- component = parent.getRenderingComponent();\r
- camera = parent.getCamera();\r
- detector = new ConstraintDetector(parent);\r
- useConstraintsAction = new Action("Constraints", Action.AS_CHECK_BOX) {\r
- public void run() {\r
- useConstraints = this.isChecked();\r
- }\r
-\r
- public void setChecked(boolean b) {\r
- super.setChecked(b);\r
- if (b) {\r
- setImageDescriptor(LOCK_ICON);\r
- } else {\r
- setImageDescriptor(LOCK_OPEN_ICON);\r
- }\r
- }\r
- };\r
- useConstraintsAction.setImageDescriptor(LOCK_OPEN_ICON);\r
-\r
- }\r
- \r
- @Override\r
- public void deactivate() {\r
- detector.clearConstraintHighlights();\r
- }\r
- \r
- @Override\r
- public void fillToolBar(IToolBarManager manager) {\r
- //this.manager = manager;\r
- useConstraintsAction.setChecked(useConstraints);\r
- manager.add(useConstraintsAction);\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.actions;\r
-\r
-import java.util.List;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-\r
-\r
-/**\r
- * Context / selection dependent action\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public abstract class ContextAction extends Action {\r
- protected ThreeDimensionalEditorBase parent;\r
-\r
- public ContextAction(ThreeDimensionalEditorBase parent) {\r
- this.parent = parent;\r
- init();\r
- }\r
- \r
- /**\r
- * Initialization\r
- */\r
- public void init(){};\r
- \r
- /**\r
- * Runs the action\r
- */\r
- public abstract void run();\r
- \r
- /**\r
- * Used to check if action is usable for given resources\r
- * @param resources\r
- * @return\r
- */\r
- public abstract boolean usable(Graph graph, List<Resource> resources);\r
- \r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.actions;\r
-\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-\r
-\r
-public interface ContextActionFactory {\r
- \r
- \r
- public ContextAction createAction(ThreeDimensionalEditorBase editor);\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.actions;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import org.simantics.utils.ui.plugin.Extension;\r
-import org.simantics.utils.ui.plugin.ExtensionLoader;\r
-\r
-\r
-\r
-public class ContextActionRegistry {\r
- /*\r
- private static ContextActionRegistry instance;\r
- public final static String ELEMENT_NAME = "ContextAction";\r
- public final static String NAME_SPACE = "org.simantics.proconf.g3d";\r
- public final static String EP_NAME = "contextaction";\r
- \r
- private ExtensionLoader<ContextActionFactory> loader;\r
- \r
- private ContextActionRegistry() {\r
- loader = new ExtensionLoader<ContextActionFactory>(ELEMENT_NAME, NAME_SPACE, EP_NAME);\r
- }\r
- \r
- public static ContextActionRegistry getInstance() {\r
- if (instance==null) instance = new ContextActionRegistry();\r
- return instance;\r
- }\r
-\r
- public Extension<ContextActionFactory>[] getExtensions() {\r
- return loader.getExtensions();\r
- }\r
-\r
- \r
- public static ContextActionFactory[] getActions(String editorID) {\r
- List<ContextActionFactory> list = new ArrayList<ContextActionFactory>();\r
- for (Extension<ContextActionFactory> e : getInstance().getExtensions()) {\r
- if(e.getStringField("editorid").compareTo(editorID) == 0) {\r
- list.add(e.getInstance());\r
- }\r
- }\r
- return list.toArray(new ContextActionFactory[0]);\r
- }\r
- */\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.actions;\r
-\r
-import java.util.Collection;\r
-import java.util.List;\r
-\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.proconf.g3d.Activator;\r
-import org.simantics.proconf.g3d.Resources;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.common.OrbitalCamera;\r
-import org.simantics.proconf.g3d.stubs.Tuple3;\r
-\r
-public class FocusAction extends ContextAction{\r
-\r
- private OrbitalCamera camera;\r
- \r
- Vector3d focusPoint = null;\r
- \r
- public FocusAction(ThreeDimensionalEditorBase parent) {\r
- super(parent);\r
- camera = parent.getCamera();\r
- }\r
- \r
- public void init() {\r
- this.setText("Focus");\r
- this.setToolTipText("Focus");\r
- this.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/eye.png"));\r
- }\r
- \r
-\r
- \r
- @Override\r
- public boolean usable(Graph graph,List<Resource> resources) {\r
- if (resources.size() != 1)\r
- return false;\r
- IEntity t = EntityFactory.create(graph, resources.get(0));\r
- \r
- if (t.isInstanceOf(Resources.g3dResource.G3DNode)) {\r
- Collection<IEntity> p = t.getRelatedObjects(Resources.g3dResource.HasWorldPosition);\r
- if (p == null || p.size() != 1)\r
- return false;\r
- else \r
- //focusPoint = new Vector3d(G3DTools.getPoint(new Position(graph,p.iterator().next().getResource())));\r
- focusPoint = new Vector3d(G3DTools.getPoint(new Tuple3(graph,p.iterator().next().getResource())));\r
- }\r
- return true;\r
- }\r
- \r
- public void run() {\r
- camera.setTarget(focusPoint);\r
- parent.setViewChanged(true);\r
- }\r
-\r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.actions;\r
-\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.input.InputProvider;\r
-\r
-\r
-\r
-/**\r
- * Context / selection dependent action that requires user's interaction\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public abstract class InteractiveAction extends ContextAction {\r
- protected InputProvider input;\r
- \r
- public InteractiveAction(ThreeDimensionalEditorBase parent) {\r
- super(parent);\r
- input = parent.getInputProvider();\r
- }\r
- \r
- public abstract void update() ;\r
-\r
- /**\r
- * Activates the action\r
- */\r
- public abstract void activate();\r
-\r
- /**\r
- * Deactivates / ends the action\r
- */\r
- public abstract void deactivate();\r
- \r
- /**\r
- * Activates the action in the viewer. Normally there's no need to override this method.\r
- */\r
- public final void run() {\r
- parent.setCurrentAction(this);\r
- }\r
- \r
- /**\r
- * This method is used to end the action, call this from <code>update()</code>.\r
- *\r
- */\r
- public void end() {\r
- parent.setCurrentAction(parent.getDefaultAction());\r
- }\r
- \r
- public void fillToolBar(IToolBarManager manager) {\r
- \r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.actions;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequest;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Session;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-\r
-public abstract class ReadAction extends ContextAction {\r
- boolean sync;\r
- public ReadAction(ThreeDimensionalEditorBase parent, boolean sync) {\r
- super(parent);\r
- this.sync = sync;\r
- }\r
-\r
- @Override\r
- public final void run() {\r
- Session session = parent.getSession();\r
- if(!canActivate()) {\r
- return;\r
- }\r
- GraphRequest r = new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- doChanges(g);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- };\r
- if (sync) {\r
- session.syncRead(r);\r
- } else {\r
- session.asyncRead(r);\r
- } \r
- }\r
- \r
- public abstract void doChanges(Graph graph) throws Exception;\r
-\r
- public boolean canActivate() {\r
- return true;\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.actions;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequest;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Session;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-\r
-public abstract class ReadInteractiveAction extends InteractiveAction {\r
- boolean sync;\r
- \r
- public ReadInteractiveAction(ThreeDimensionalEditorBase parent, boolean sync) {\r
- super(parent);\r
- this.sync = sync;\r
- }\r
- \r
- @Override\r
- public final void update(){\r
- Session session = parent.getSession();\r
- GraphRequest r = new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- doChanges(g);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- };\r
- if (sync) {\r
- session.syncRead(r);\r
- } else {\r
- session.asyncRead(r);\r
- } \r
- }\r
-\r
- \r
- public abstract void doChanges(Graph graph) throws Exception;\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.actions;\r
-\r
-import java.util.List;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.proconf.g3d.Activator;\r
-import org.simantics.proconf.g3d.Resources;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-\r
-public class RemoveAction extends WriteAction {\r
- \r
- public RemoveAction(ThreeDimensionalEditorBase parent) {\r
- super(parent,false);\r
- }\r
- \r
- public void init() {\r
- setText("Remove");\r
- setToolTipText("Remove the object");\r
- this.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/delete.png"));\r
- }\r
- public GraphRequestStatus doChanges(Graph graph) {\r
- StructuredResourceSelection sel = parent.getSelectionAdapter().getCurrentSelection();\r
- List<Resource> res = sel.getSelectionList();\r
- for (Resource r : res) {\r
- IEntity t = EntityFactory.create(graph, r);\r
- if (t.isInstanceOf(Resources.g3dResource.G3DNode)) {\r
- IEntity parentNode = t.getSingleRelatedObject(Resources.g3dResource.HasParent);\r
- parentNode.removeStatement(Resources.g3dResource.HasChild, t);\r
- }\r
-\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- \r
- }\r
- \r
- @Override\r
- public boolean usable(Graph graph,List<Resource> resources) {\r
- return resources.size() > 0;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.actions;\r
-\r
-import java.awt.event.KeyEvent;\r
-import java.awt.event.MouseEvent;\r
-import java.util.Collection;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.AxisAngle4f;\r
-import javax.vecmath.Quat4d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequest;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Session;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.proconf.g3d.Activator;\r
-import org.simantics.proconf.g3d.Resources;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.JmeRenderingComponent;\r
-import org.simantics.proconf.g3d.base.MathTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.base.VecmathJmeTools;\r
-import org.simantics.proconf.g3d.common.OrbitalCamera;\r
-import org.simantics.proconf.g3d.gizmo.RotateGizmo;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-\r
-public class RotateAction extends WriteInteractiveAction {\r
- \r
- private JmeRenderingComponent component;\r
- \r
- private RotateGizmo gizmo;\r
-\r
- private OrbitalCamera camera;\r
- \r
- private Map<IGraphicsNode, AxisAngle4d > rotations = new HashMap<IGraphicsNode, AxisAngle4d>();\r
- \r
- private int steps; \r
- private double angles[];\r
- \r
- private Action csAction;\r
- private boolean worldCoord = true;\r
- private IToolBarManager manager;\r
- \r
- private List<IGraphicsNode> mos;\r
- AxisAngle4d aa;\r
- Quat4d q;\r
- \r
- public RotateAction(ThreeDimensionalEditorBase parent) {\r
- super(parent,true);\r
- component = parent.getRenderingComponent();\r
- camera = parent.getCamera();\r
- gizmo = new RotateGizmo(component.getDisplaySystem().getRenderer());\r
- csAction = new Action("World",Action.AS_CHECK_BOX) {\r
- public void run() {\r
- GraphRequest r = new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- setWorldCoord(g,!isChecked());\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- };\r
- RotateAction.this.parent.getSession().asyncRead(r);\r
- \r
- }\r
- };\r
- }\r
- \r
- public void init() {\r
- this.setText("Rotate");\r
- this.setToolTipText("Rotate the object");\r
- this.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/rotate.png"));\r
- steps = 36;\r
- angles = new double[steps+1];\r
- for (int i = 0; i < angles.length; i++) {\r
- angles[i] = - Math.PI + (Math.PI * i * 2.0 / steps);\r
- }\r
- }\r
- \r
- @Override\r
- public boolean usable(Graph graph, List<Resource> resources) {\r
- if (resources.size() == 0)\r
- return false;\r
- for (Resource r : resources) {\r
- IEntity t = EntityFactory.create(graph,r);\r
- if (t.isInstanceOf(Resources.g3dResource.G3DNode)) {\r
- Collection<IEntity> p = t.getRelatedObjects(Resources.g3dResource.HasLocalOrientation);\r
- if (p == null || p.size() != 1)\r
- return false;\r
- }\r
- \r
- }\r
- return true;\r
- \r
- }\r
- \r
- @Override\r
- public void deactivate() {\r
- inputType = InputType.NONE;\r
- parent.setGizmo(null);\r
- mos = null;\r
-\r
- }\r
- \r
- public void fillToolBar(IToolBarManager manager) {\r
- super.fillToolBar(manager);\r
- this.manager = manager;\r
- csAction.setChecked(!worldCoord);\r
- manager.add(csAction);\r
- \r
- }\r
- \r
- private void setWorldCoord(Graph graph,boolean b) {\r
- if (worldCoord == b)\r
- return;\r
- worldCoord = b;\r
- updateWorldCoord(graph);\r
- }\r
- \r
- private void updateWorldCoord(Graph graph) {\r
- if (worldCoord) {\r
- csAction.setText("World");\r
- gizmo.setRotation(new AxisAngle4f());\r
- aa = null;\r
- q = null;\r
- } else {\r
- csAction.setText("Local");\r
- aa = G3DTools.getOrientation(mos.get(0).getParent().getG3DNode(graph).getWorldOrientation());\r
- if (aa == null)\r
- aa = new AxisAngle4d();\r
- gizmo.setRotation(new AxisAngle4f(aa));\r
- q = new Quat4d();\r
- q.set(aa);\r
- }\r
- if (manager != null)\r
- manager.update(true);\r
- this.parent.setViewChanged(true);\r
- }\r
- \r
- @Override\r
- public void activate() {\r
- \r
- Session session = parent.getSession();\r
- \r
- GraphRequest r = new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- parent.setGizmo(gizmo);\r
- \r
- component.getNoShadowRoot().attachChild(gizmo.getNode());\r
- updateGizmo();\r
-\r
- String text = "";\r
- mos = parent.getSelectionAdapter().getSelectedObjects();\r
- rotations = new HashMap<IGraphicsNode, AxisAngle4d>();\r
- for (IGraphicsNode mo : mos) {\r
- G3DNode n = mo.getG3DNode(g);\r
- rotations.put(mo,G3DTools.getOrientation(n.getLocalOrientation()));\r
- text += G3DTools.getOrientation(n.getLocalOrientation()) + " " + MathTools.getEuler(G3DTools.getOrientation(mo.getG3DNode(g).getLocalOrientation())) + " ";\r
- }\r
- setInfoText(text);\r
- parent.setViewChanged(true);\r
- inputType = InputType.NONE;\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- };\r
- \r
- session.syncRead(r);\r
- \r
- \r
- }\r
- \r
- \r
- private Vector3d getRotationAxis() {\r
- switch (gizmo.getSelected()) {\r
- case RotateGizmo.X:\r
- return new Vector3d(1.0,0.0,0.0);\r
- case RotateGizmo.Y:\r
- return new Vector3d(0.0,1.0,0.0);\r
- case RotateGizmo.Z:\r
- return new Vector3d(0.0,0.0,1.0);\r
- case RotateGizmo.XYZ:\r
- Vector3d axis = camera.getUnNormalizedHeading();\r
- axis.normalize();\r
- return axis;\r
- default:\r
- return null;\r
- }\r
- }\r
- private double prevS = 0.0;\r
- \r
- private Vector3d i = new Vector3d();\r
- private Vector3d j = new Vector3d();\r
- private double prevAngle = 0;\r
-\r
- enum InputType{INTERSECT,NONINTERSECT,KEY,NONE};\r
- InputType inputType;\r
- private boolean useStep = false;\r
- \r
- @Override\r
- public void doChanges(Graph graph) throws Exception {\r
- \r
- if (input.mousePressed()) {\r
- Vector3d axis = getRotationAxis();\r
- if (axis != null) {\r
- if (!worldCoord) {\r
- MathTools.rotate(q, axis, axis);\r
- }\r
- Vector3d o = new Vector3d();\r
- Vector3d d = new Vector3d();\r
- parent.createPickRay(o, d);\r
- Vector3d p = gizmo.getPosition();\r
- double s[] = new double[2];\r
- Vector3d i2 = new Vector3d();\r
- if ((input.pressModifiers() & MouseEvent.CTRL_MASK) > 0) {\r
- useStep = true;\r
- } else {\r
- useStep = false;\r
- }\r
- if (MathTools.intersectStraightPlane(o, d, p, axis, i2, s) && Math.abs(d.dot(axis)) > 0.2)\r
- inputType = InputType.INTERSECT;\r
- else\r
- inputType = InputType.NONINTERSECT;\r
- \r
- \r
- if (inputType == InputType.INTERSECT) {\r
- // picking ray and plane defined by gizmo's center point and\r
- // rotation axis can intersect\r
- // vector from center point to intersection point\r
- i2.sub(p);\r
- // creating vectors i and j that are lying on the plane and\r
- // are perpendicular\r
- // vectors are used to calculate polar coordinate for\r
- // intersection point\r
- j.set(i2);\r
- i.cross(j, axis);\r
- double angleI = i2.angle(i);\r
- double angleJ = i2.angle(j);\r
- prevAngle = Math.atan2(Math.cos(angleJ), Math.cos(angleI));\r
- } else {\r
- // picking ray and plane defined by gizmo's center point and\r
- // rotation axis are parallel,\r
- // so we'll use cross product of rotation axis and picking\r
- // ray to detect amount of rotation\r
- i.cross(d, axis);\r
- MathTools.intersectStraightStraight(o, d, p, i, new Vector3d(), new Vector3d(), s);\r
- prevS = s[1];\r
- }\r
- }\r
- \r
- \r
- }\r
- if (input.mouseClicked()) {\r
- end();\r
- return;\r
- }\r
- Vector3d axis = null;\r
- if (input.keyPressed(KeyEvent.VK_LEFT)) {\r
- inputType = InputType.KEY;\r
- axis = new Vector3d(0.0,1.0,0.0);\r
- } else if (input.keyPressed(KeyEvent.VK_RIGHT)) {\r
- inputType = InputType.KEY;\r
- axis = new Vector3d(0.0,-1.0,0.0);\r
- } else if (input.keyPressed(KeyEvent.VK_UP)) {\r
- inputType = InputType.KEY;\r
- axis = new Vector3d(1.0,0.0,0.0);\r
- } else if (input.keyPressed(KeyEvent.VK_DOWN)) {\r
- inputType = InputType.KEY;\r
- axis = new Vector3d(-1.0,0.0,0.0);\r
- } else if (!input.mouseDragged()) {\r
- parent.getDefaultAction().update();\r
- return;\r
- }\r
- parent.setViewChanged(true);\r
- \r
- \r
- updateGizmo();\r
- List<IGraphicsNode> mos = parent.getSelectionAdapter().getSelectedObjects();\r
- if (inputType != InputType.KEY)\r
- axis = getRotationAxis();\r
- if (axis == null) {\r
- parent.getDefaultAction().update();\r
- return; \r
- }\r
- Vector3d taxis = null;\r
- if (!worldCoord) {\r
- taxis = new Vector3d(axis);\r
- MathTools.rotate(q, axis, axis);\r
- }\r
- String text = "";\r
- if (inputType == InputType.INTERSECT) {\r
- Vector3d o = new Vector3d();\r
- Vector3d d = new Vector3d();\r
- parent.createPickRay(o, d);\r
- Vector3d p = gizmo.getPosition();\r
- double s[] = new double[2];\r
- Vector3d i2 = new Vector3d();\r
- MathTools.intersectStraightPlane(o, d, p, axis, i2, s);\r
- i2.sub(p);\r
- double angleI = i2.angle(i);\r
- double angleJ = i2.angle(j);\r
- double angle = Math.atan2(Math.cos(angleJ), Math.cos(angleI));\r
- if(!worldCoord)\r
- axis = taxis;\r
- if (false && useStep) {\r
- for (IGraphicsNode mo : mos) {\r
- G3DTools.setOrientation(mo.getG3DNode(graph).getLocalOrientation(), rotations.get(mo));\r
- // FIXME : commit\r
- G3DTools.multiplyOrientation(mo.getG3DNode(graph).getWorldOrientation(), new AxisAngle4d(axis,angle-prevAngle));\r
- //mo.setRotation(rotations.get(mo));\r
- //mo.modifyWorldRotation(axis, angle - prevAngle);\r
- AxisAngle4d aa = G3DTools.getOrientation(mo.getG3DNode(graph).getLocalOrientation());\r
- rotations.put(mo, aa);\r
- prevAngle = angle;\r
- Vector3d euler = MathTools.getEuler(aa);\r
- euler.x = roundAngle(euler.x);\r
- euler.y = roundAngle(euler.y);\r
- euler.z = roundAngle(euler.z);\r
- aa = MathTools.getFromEuler2(euler);\r
- G3DTools.setOrientation(mo.getG3DNode(graph).getLocalOrientation(), aa);\r
- //mo.setRotation(aa);\r
- Vector3d e = MathTools.getEuler(G3DTools.getOrientation(mo.getG3DNode(graph).getLocalOrientation()));\r
- e.scale(180.0/Math.PI);\r
- text += G3DTools.getOrientation(mo.getG3DNode(graph).getLocalOrientation()) + " " + e + " ";\r
- }\r
- } else {\r
- for (IGraphicsNode mo : mos) {\r
- if (worldCoord)\r
- G3DTools.multiplyOrientation\r
- (mo.getG3DNode(graph).getWorldOrientation(), new AxisAngle4d(axis,angle-prevAngle));\r
- else\r
- G3DTools.multiplyOrientation(mo.getG3DNode(graph).getLocalOrientation(), new AxisAngle4d(axis,angle-prevAngle));\r
- text += G3DTools.getOrientation(mo.getG3DNode(graph).getLocalOrientation()) + " " + MathTools.getEuler(G3DTools.getOrientation(mo.getG3DNode(graph).getLocalOrientation())) + " ";\r
- }\r
- prevAngle = angle;\r
- }\r
- \r
- } else if (inputType == InputType.NONINTERSECT){\r
- Vector3d o = new Vector3d();\r
- Vector3d d = new Vector3d();\r
- parent.createPickRay(o, d);\r
- Vector3d p = gizmo.getPosition();\r
- double s[] = new double[2];\r
- MathTools.intersectStraightStraight(o, d, p, i, new Vector3d(), new Vector3d(), s);\r
- if(!worldCoord)\r
- axis = taxis;\r
- if (false && useStep) {\r
- for (IGraphicsNode mo : mos) {\r
- G3DTools.setOrientation(mo.getG3DNode(graph).getLocalOrientation(), rotations.get(mo));\r
- G3DTools.multiplyOrientation(mo.getG3DNode(graph).getWorldOrientation(), new AxisAngle4d(axis,s[1] - prevS));\r
- //mo.setRotation(rotations.get(mo));\r
- //mo.modifyWorldRotation(axis, s[1] - prevS);\r
- AxisAngle4d aa = G3DTools.getOrientation(mo.getG3DNode(graph).getLocalOrientation());\r
- rotations.put(mo, aa);\r
- Vector3d euler = MathTools.getEuler(aa);\r
- euler.x = roundAngle(euler.x);\r
- euler.y = roundAngle(euler.y);\r
- euler.z = roundAngle(euler.z);\r
- aa = MathTools.getFromEuler2(euler);\r
- prevS = s[1];\r
- G3DTools.setOrientation(mo.getG3DNode(graph).getLocalOrientation(), aa);\r
- //mo.setRotation(aa);\r
- Vector3d e = MathTools.getEuler(G3DTools.getOrientation(mo.getG3DNode(graph).getLocalOrientation()));\r
- e.scale(180.0/Math.PI);\r
- text += G3DTools.getOrientation(mo.getG3DNode(graph).getLocalOrientation()) + " " + e + " ";\r
- }\r
- } else {\r
- for (IGraphicsNode mo : mos) {\r
- if (worldCoord)\r
- G3DTools.multiplyOrientation(mo.getG3DNode(graph).getWorldOrientation(), new AxisAngle4d(axis,s[1] - prevS));\r
- else\r
- G3DTools.multiplyOrientation(mo.getG3DNode(graph).getLocalOrientation(), new AxisAngle4d(axis,s[1] - prevS));\r
- text += G3DTools.getOrientation(mo.getG3DNode(graph).getLocalOrientation()) + " " + MathTools.getEuler(G3DTools.getOrientation(mo.getG3DNode(graph).getLocalOrientation())) + " ";\r
- }\r
- prevS = s[1];\r
- \r
- }\r
- \r
- } else {\r
- for (IGraphicsNode mo : mos) {\r
- if (worldCoord)\r
- G3DTools.multiplyOrientation(mo.getG3DNode(graph).getWorldOrientation(), new AxisAngle4d(axis,Math.PI * 0.5));\r
- else\r
- G3DTools.multiplyOrientation(mo.getG3DNode(graph).getLocalOrientation(), new AxisAngle4d(axis,Math.PI * 0.5));\r
- text += G3DTools.getOrientation(mo.getG3DNode(graph).getLocalOrientation()) + " " + MathTools.getEuler(G3DTools.getOrientation(mo.getG3DNode(graph).getLocalOrientation())) + " ";\r
- }\r
- }\r
- setInfoText(text);\r
- \r
- }\r
- /*\r
- private double roundAngle(double current, double modify) {\r
- double angle = roundAngle(current+modify);\r
- if (Double.isNaN(angle)) {\r
- angle = current+modify;\r
- }\r
- //System.out.println(angle + " " + (current+modify));\r
- return angle;\r
- }\r
- */\r
- \r
- private double roundAngle(double angle) {\r
- while (angle < - Math.PI)\r
- angle += Math.PI*2.0;\r
- while (angle > Math.PI)\r
- angle -= Math.PI*2.0;\r
- \r
- \r
- int index = 0;\r
- while (angle > angles[index])\r
- index++;\r
- if (index == 0) {\r
- angle = angles[0];\r
- } else {\r
- double d = angle - angles[index - 1];\r
- double d2 = angles[index] - angle;\r
- if (d < d2)\r
- angle = angles[index - 1];\r
- else\r
- angle = angles[index];\r
- }\r
- return angle;\r
- }\r
- \r
- private void updateGizmo() {\r
- List<IGraphicsNode> mos = parent.getSelectionAdapter().getSelectedObjects();\r
- //gizmo.update(XithTools.getPosition(mos.get(0).getGroup()),camera.getCameraPos(),component);\r
- gizmo.update(VecmathJmeTools.getD(mos.get(0).getGroup().getWorldTranslation()),camera.getCameraPos(),component);\r
- }\r
- \r
- public void setInfoText(String text) {\r
- \r
- }\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.actions;\r
-\r
-import java.awt.event.MouseEvent;\r
-import java.math.BigDecimal;\r
-import java.util.Collection;\r
-import java.util.List;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.AxisAngle4f;\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Quat4d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequest;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.proconf.g3d.Activator;\r
-import org.simantics.proconf.g3d.Resources;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.MathTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.gizmo.TransformGizmo;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.stubs.Orientation;\r
-import org.simantics.proconf.g3d.stubs.Position;\r
-\r
-\r
-public class TranslateAction extends ConstrainedTransformAction {\r
- \r
- \r
- private TransformGizmo gizmo;\r
- \r
- private double istep = 10.0;\r
- private int decimals = 2;\r
- \r
- \r
- private Action csAction;\r
- List<IGraphicsNode> mos = null;\r
- \r
- private boolean worldCoord = true;\r
- \r
- \r
- private AxisAngle4d aa;\r
- private Quat4d q;\r
- \r
- public TranslateAction(ThreeDimensionalEditorBase parent) {\r
- super(parent);\r
- \r
- csAction = new Action("World",Action.AS_CHECK_BOX) {\r
- public void run() {\r
- GraphRequest r = new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- setWorldCoord(g,!isChecked());\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- };\r
- TranslateAction.this.parent.getSession().asyncRead(r);\r
- \r
- }\r
- };\r
- gizmo = new TransformGizmo(component.getDisplaySystem().getRenderer());\r
- }\r
- \r
- public void init() {\r
- this.setText("Translate");\r
- this.setToolTipText("Translate the object");\r
- this.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/translate.png"));\r
- }\r
- \r
- @Override\r
- public boolean usable(Graph graph, List<Resource> resources) {\r
- if (resources.size() == 0)\r
- return false;\r
- for (Resource r : resources) {\r
- IEntity t = EntityFactory.create(graph,r);\r
- if (t.isInstanceOf(Resources.g3dResource.G3DNode)) {\r
- Collection<IEntity> p = t.getRelatedObjects(Resources.g3dResource.HasLocalPosition);\r
- if (p == null || p.size() != 1)\r
- return false;\r
- }\r
- \r
- }\r
- return true;\r
- \r
- }\r
- \r
- @Override\r
- public void deactivate() {\r
- super.deactivate();\r
- parent.setGizmo(null);\r
- mos = null;\r
- }\r
- \r
- private void setWorldCoord(Graph graph,boolean b) {\r
- if (worldCoord == b)\r
- return;\r
- worldCoord = b;\r
- updateWorldCoord(graph);\r
- }\r
- \r
- private void updateWorldCoord(Graph graph) {\r
- if (worldCoord) {\r
- csAction.setText("World");\r
- gizmo.setRotation(new AxisAngle4f());\r
- aa = null;\r
- q = null;\r
- } else {\r
- csAction.setText("Local");\r
- Orientation o = mos.get(0).getParent().getG3DNode(graph).getWorldOrientation();\r
- if (o == null) {\r
- aa = new AxisAngle4d();\r
- } else {\r
- aa = G3DTools.getOrientation(o);\r
- }\r
- \r
- gizmo.setRotation(new AxisAngle4f(aa));\r
- q = new Quat4d();\r
- q.set(aa);\r
- }\r
-// if (manager != null)\r
-// parent.getRenderingComposite().getDisplay().asyncExec(new Runnable() {\r
-// public void run() {\r
-// manager.update(true);\r
-// }\r
-// });\r
- \r
- this.parent.setViewChanged(true);\r
- }\r
- \r
- public void fillToolBar(IToolBarManager manager) {\r
- super.fillToolBar(manager);\r
- csAction.setChecked(!worldCoord);\r
- manager.add(csAction);\r
- }\r
-\r
- @Override\r
- public void activate() {\r
- GraphRequest r = new GraphRequestAdapter() {\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- parent.setGizmo(gizmo);\r
-\r
- updateGizmo(g);\r
-\r
- component.getNoShadowRoot().attachChild(gizmo.getNode());\r
- \r
- String text = "";\r
- mos = parent.getSelectionAdapter().getSelectedObjects();\r
- for (IGraphicsNode mo : mos) {\r
- if (worldCoord)\r
- text += G3DTools.getVector(mo.getG3DNode(g).getWorldPosition()) + " ";//mo.getWorldPosition() + " ";\r
- else\r
- text += G3DTools.getVector(mo.getG3DNode(g).getLocalPosition()) + " ";\r
- }\r
- final String fText = text;\r
- parent.getRenderingComposite().getDisplay().asyncExec(new Runnable() {\r
- public void run() {\r
- setInfoText(fText); \r
- }\r
- });\r
- \r
- Resource r[] = new Resource[mos.size()];\r
- for (int i = 0; i < mos.size(); i++) {\r
- r[i] = mos.get(i).getResource();\r
- }\r
- \r
- TranslateActionConstraints.addConstraints(r, detector); \r
- updateWorldCoord(g);\r
- return GraphRequestStatus.transactionComplete();\r
- };\r
- \r
- };\r
- parent.getSession().asyncRead(r);\r
- \r
- }\r
- \r
- Vector3d getTranslate(Graph graph) {\r
- return getTranslate(graph,new Vector3d());\r
- }\r
- \r
- Vector3d getTranslate(Graph graph,Vector3d offset) {\r
- Vector3d translate = new Vector3d();\r
- Vector3d o = new Vector3d();\r
- Vector3d d = new Vector3d();\r
- parent.createPickRay(o, d);\r
- Vector3d p = G3DTools.getVector(mos.get(0).getG3DNode(graph).getWorldPosition());//gizmo.getPosition();\r
- Vector3d dir = null;\r
- switch (gizmo.getSelected()) {\r
- case TransformGizmo.XYZ :\r
- Vector3d normal = camera.getUnNormalizedHeading();\r
- if(!worldCoord)\r
- MathTools.rotate(q, normal, normal);\r
- normal.normalize();\r
- double s[] = new double[1];\r
- Vector3d r = new Vector3d();\r
- if (MathTools.intersectStraightPlane(o, d, p, normal, r)) {\r
- r.sub(p);\r
- translate.x = r.x;\r
- translate.y = r.y;\r
- translate.z = r.z;\r
- }\r
- break;\r
- case TransformGizmo.X :\r
- dir = new Vector3d(1.0,0.0,0.0);\r
- if(!worldCoord)\r
- MathTools.rotate(q, dir, dir);\r
- Vector3d i1 = new Vector3d();\r
- Vector3d i2 = new Vector3d();\r
- s = new double[2];\r
- MathTools.intersectStraightStraight( p, dir,o, d, i2, i1,s);\r
- translate.x = s[0];\r
- \r
- break;\r
- case TransformGizmo.Y :\r
- dir = new Vector3d(0.0,1.0,0.0);\r
- if(!worldCoord)\r
- MathTools.rotate(q, dir, dir);\r
- i1 = new Vector3d();\r
- i2 = new Vector3d();\r
- s = new double[2];\r
- MathTools.intersectStraightStraight( p, dir,o, d, i2, i1,s);\r
- translate.y = s[0];\r
- break;\r
- case TransformGizmo.Z :\r
- dir = new Vector3d(0.0,0.0,1.0);\r
- if(!worldCoord)\r
- MathTools.rotate(q, dir, dir);\r
- i1 = new Vector3d();\r
- i2 = new Vector3d();\r
- s = new double[2];\r
- MathTools.intersectStraightStraight( p, dir,o, d, i2, i1,s);\r
- translate.z = s[0];\r
- break;\r
- case TransformGizmo.XY :\r
- normal = new Vector3d(0.0,0.0,1.0);\r
- if(!worldCoord)\r
- MathTools.rotate(q, normal, normal);\r
- r = new Vector3d();\r
- if (MathTools.intersectStraightPlane(o, d, p, normal, r)) {\r
- r.sub(p);\r
- translate.x = r.x;\r
- translate.y = r.y;\r
- }\r
- break;\r
- case TransformGizmo.XZ :\r
- normal = new Vector3d(0.0,1.0,0.0);\r
- if(!worldCoord)\r
- MathTools.rotate(q, normal, normal);\r
- r = new Vector3d();\r
- if (MathTools.intersectStraightPlane(o, d, p, normal, r)) {\r
- r.sub(p);\r
- translate.x = r.x;\r
- translate.z = r.z;\r
- }\r
- break;\r
- case TransformGizmo.YZ :\r
- normal = new Vector3d(1.0,0.0,0.0);\r
- if(!worldCoord)\r
- MathTools.rotate(q, normal, normal);\r
- r = new Vector3d();\r
- if (MathTools.intersectStraightPlane(o, d, p, normal, r)) {\r
- r.sub(p);\r
- translate.y = r.y;\r
- translate.z = r.z;\r
- }\r
- break;\r
- default :\r
- \r
- return null;\r
- }\r
- translate.sub(offset);\r
- \r
- if (useConstraints && dir != null) {\r
- switch (gizmo.getSelected()) {\r
- case TransformGizmo.X:\r
- case TransformGizmo.Y:\r
- case TransformGizmo.Z:\r
- Vector3d t = new Vector3d(translate);\r
- // TODO : to the test against all translated objects and snap to closest one\r
- Point3d pos = G3DTools.getPoint(mos.get(0).getG3DNode(graph).getWorldPosition());\r
- t.add(pos);\r
- Point3d snap = detector.getPointSnap2(t, dir);\r
- if (snap != null) {\r
- // System.out.print("t: " + translate);\r
- translate = new Vector3d(snap);\r
- translate.sub(pos);\r
- // System.out.println(" " + translate);\r
- }\r
- break;\r
- \r
- }\r
- }\r
- return translate;\r
- }\r
- \r
- Vector3d prevTranslate = new Vector3d();\r
- \r
- @Override\r
- public void doChanges(Graph graph) throws Exception {\r
- if (input.mousePressed()) {\r
- boolean b = useConstraints;\r
- useConstraints = false;\r
- prevTranslate = getTranslate(graph);\r
- useConstraints = b;\r
- }\r
- if (input.mouseClicked()) {\r
- end();\r
- return;\r
- }\r
- if (!input.mouseDragged()) {\r
- parent.getDefaultAction().update();\r
- return;\r
- } \r
- detector.clearConstraintHighlights();\r
- parent.setViewChanged(true);\r
- \r
- \r
- \r
- Vector3d translate = getTranslate(graph,prevTranslate);\r
- \r
- if (translate == null) {\r
- //cameraRotateAction.update();\r
- parent.getDefaultAction().update();\r
- updateGizmo(graph);\r
- return;\r
- }\r
- //translate.sub(prevTranslate);\r
- \r
- if ((input.dragModifiers() & MouseEvent.CTRL_MASK) > 0) {\r
- String text = "";\r
- for (IGraphicsNode mo : mos) {\r
- \r
- Point3d p;\r
- if (worldCoord)\r
- p = G3DTools.getPoint(mo.getG3DNode(graph).getWorldPosition());//mo.getWorldPosition();\r
- else\r
- p = G3DTools.getPoint(mo.getG3DNode(graph).getLocalPosition());\r
- p.add(translate);\r
- if (gizmo.getSelected() == TransformGizmo.X || gizmo.getSelected() == TransformGizmo.XY || gizmo.getSelected() == TransformGizmo.XZ || gizmo.getSelected() == TransformGizmo.XYZ) {\r
- p.x = Math.round(istep * p.x) / istep;\r
- BigDecimal bx = new BigDecimal(p.x);\r
- bx.setScale(decimals, BigDecimal.ROUND_HALF_UP);\r
- p.x = bx.doubleValue();\r
- }\r
- if (gizmo.getSelected() == TransformGizmo.Y || gizmo.getSelected() == TransformGizmo.XY || gizmo.getSelected() == TransformGizmo.YZ || gizmo.getSelected() == TransformGizmo.XYZ) {\r
- p.y = Math.round(istep * p.y) / istep;\r
- BigDecimal by = new BigDecimal(p.y);\r
- by.setScale(decimals, BigDecimal.ROUND_HALF_UP);\r
- p.y = by.doubleValue();\r
- }\r
- if (gizmo.getSelected() == TransformGizmo.Z || gizmo.getSelected() == TransformGizmo.YZ || gizmo.getSelected() == TransformGizmo.XZ || gizmo.getSelected() == TransformGizmo.XYZ) { \r
- p.z = Math.round(istep * p.z) / istep;\r
- BigDecimal bz = new BigDecimal(p.z);\r
- bz.setScale(decimals, BigDecimal.ROUND_HALF_UP);\r
- p.z = bz.doubleValue();\r
- }\r
- text += p + " ";\r
- if (worldCoord)\r
- G3DTools.setTuple3(mo.getG3DNode(graph).getWorldPosition(), p); \r
- else\r
- G3DTools.setTuple3(mo.getG3DNode(graph).getLocalPosition(), p);\r
- //mo.setWorldTranslation(p);\r
- \r
- }\r
- if (useConstraints)\r
- text+=detector.getSnapString();\r
- setInfoText(text);\r
- \r
- } else {\r
- String text = "";\r
- for (IGraphicsNode mo : mos) {\r
- Position pos;\r
- if (worldCoord) {\r
- pos = mo.getG3DNode(graph).getWorldPosition(); \r
- } else {\r
- pos = mo.getG3DNode(graph).getLocalPosition();\r
- }\r
- Point3d p = G3DTools.getPoint(pos);\r
- p.add(translate);\r
- text += p;\r
- G3DTools.setTuple3(pos, p);\r
- }\r
- if (useConstraints)\r
- text+=detector.getSnapString();\r
- setInfoText(text);\r
- // parent.getGraph().commitChanges(CommitMessage.CHANGE_MESSAGE);\r
- }\r
- updateGizmo(graph);\r
-\r
- }\r
- \r
- protected void updateGizmo(Graph graph) {\r
- List<IGraphicsNode> mos = parent.getSelectionAdapter().getSelectedObjects();\r
- if (mos.size() == 0) {\r
- end();\r
- return;\r
- }\r
- gizmo.update(G3DTools.getVector(mos.get(0).getG3DNode(graph).getWorldPosition()),camera.getCameraPos(),component);\r
- \r
- }\r
- \r
- public void setInfoText(String text) {\r
- \r
- }\r
-\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.actions;\r
-\r
-import org.simantics.db.Resource;\r
-import org.simantics.proconf.g3d.base.ConstraintDetector;\r
-\r
-\r
-/**\r
- * Temporary class to handle "Automatic" constraints for translation\r
- * TODO : create extension point / extension that can provide constraints\r
- * TODO : how to override previously added constraints ?\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public class TranslateActionConstraints {\r
- \r
- \r
- public static void addConstraints(Resource translated[], ConstraintDetector detector) {\r
- detector.clearConstraints();\r
- // these must be provided through extension point !\r
-// if (isElbow(translated)) {\r
-// addElbowConstraints(translated, detector);\r
-// } else if (isPipeControlPoint(translated)) {\r
-// addPipeControlPointConstraints(translated, detector);\r
-// } else if (isEndComponent(translated)) {\r
-// addEndComponentConstraints(translated, detector);\r
-// }\r
- \r
- \r
- }\r
- \r
- /*\r
- * These methods must be inserted into extension\r
- */\r
- \r
-// private static boolean isElbow(Resource translated[]) {\r
-// for (Resource r : translated) {\r
-// if (!r.isInstanceOf(GlobalIdMap.get(PSK3DModelingOntologyMapping.ELBOW))) {\r
-// return false;\r
-// }\r
-// }\r
-// return true;\r
-// }\r
-// \r
-// private static boolean isEndComponent(Resource translated[]) {\r
-// for (Resource r : translated) {\r
-// if (!r.isInstanceOf(GlobalIdMap.get(PSK3DModelingOntologyMapping.END_COMPONENT))) {\r
-// return false;\r
-// }\r
-// }\r
-// return true;\r
-// }\r
-// \r
-// private static boolean isPipeControlPoint(Resource translated[]) {\r
-// for (Resource r : translated) {\r
-// if (!r.isInstanceOf(GlobalIdMap.get(PSK3DModelingOntologyMapping.PIPE_CONTROL_POINT))) {\r
-// return false;\r
-// }\r
-// }\r
-// return true;\r
-// }\r
-// \r
-// private static void addElbowConstraints(Resource translated[], ConstraintDetector detector) {\r
-// Set<Resource> res = new HashSet<Resource>();\r
-// // add all controlpoints connected to every elbow's controlpoint\r
-// for (Resource r : translated) {\r
-// Elbow elbow = ElbowFactory.create(r);\r
-// PipeControlPoint p = elbow.getHasControlPoint();\r
-// PipeControlPoint next = PipingTools.findNextEnd(p);\r
-// PipeControlPoint previous = PipingTools.findPreviousEnd(p);\r
-// if (next != null)\r
-// res.add(next.getResource());\r
-// if (previous != null)\r
-// res.add(previous.getResource());\r
-// \r
-// }\r
-// // remove all controlpoints that are elbows' controlpoints\r
-// for (Resource r : translated) {\r
-// Elbow elbow = ElbowFactory.create(r);\r
-// res.remove(elbow.getHasControlPoint().getResource());\r
-// }\r
-// for (Resource r : res) {\r
-// PipeControlPoint p = PipeControlPointFactory.create(r);\r
-// detector.addContraintPoint(GraphicsNodeTools.getPoint(p.getLocalPosition()));\r
-// }\r
-// }\r
-// \r
-// private static void addEndComponentConstraints(Resource translated[], ConstraintDetector detector) {\r
-// Set<Resource> res = new HashSet<Resource>();\r
-// // add all controlpoints connected to every elbow's controlpoint\r
-// for (Resource r : translated) {\r
-// EndComponent elbow = EndComponentFactory.create(r);\r
-// PipeControlPoint p = elbow.getHasControlPoint();\r
-// PipeControlPoint next = PipingTools.findNextEnd(p);\r
-// PipeControlPoint previous = PipingTools.findPreviousEnd(p);\r
-// if (next != null)\r
-// res.add(next.getResource());\r
-// if (previous != null)\r
-// res.add(previous.getResource());\r
-// \r
-// }\r
-// // remove all controlpoints that are elbows' controlpoints\r
-// for (Resource r : translated) {\r
-// EndComponent elbow = EndComponentFactory.create(r);\r
-// res.remove(elbow.getHasControlPoint().getResource());\r
-// }\r
-// for (Resource r : res) {\r
-// PipeControlPoint p = PipeControlPointFactory.create(r);\r
-// detector.addContraintPoint(GraphicsNodeTools.getPoint(p.getLocalPosition()));\r
-// }\r
-// }\r
-// \r
-// \r
-// private static void addPipeControlPointConstraints(Resource translated[], ConstraintDetector detector) {\r
-// Set<Resource> res = new HashSet<Resource>();\r
-// // add all controlpoints connected to every elbow's controlpoint\r
-// for (Resource r : translated) {\r
-// PipeControlPoint p = PipeControlPointFactory.create(r);\r
-// PipeControlPoint next = PipingTools.findNextEnd(p);\r
-// PipeControlPoint previous = PipingTools.findPreviousEnd(p);\r
-// if (next != null)\r
-// res.add(next.getResource());\r
-// if (previous != null)\r
-// res.add(previous.getResource());\r
-// \r
-// }\r
-// // remove all controlpoints that are elbows' controlpoints\r
-// for (Resource r : translated) {\r
-// res.remove(r);\r
-// }\r
-// for (Resource r : res) {\r
-// PipeControlPoint p = PipeControlPointFactory.create(r);\r
-// detector.addContraintPoint(GraphicsNodeTools.getPoint(p.getLocalPosition()));\r
-// }\r
-// }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.actions;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequest;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Session;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-\r
-public abstract class WriteAction extends ContextAction {\r
- boolean sync;\r
- public WriteAction(ThreeDimensionalEditorBase parent, boolean sync) {\r
- super(parent);\r
- this.sync = sync;\r
- }\r
-\r
- @Override\r
- public final void run() {\r
- Session session = parent.getSession();\r
- if(!canActivate()) {\r
- return;\r
- }\r
- GraphRequest r = new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- return doChanges(g);\r
- }\r
- \r
- @Override\r
- public void requestCompleted(GraphRequestStatus status) {\r
- afterChanges(status);\r
- }\r
- };\r
- if (sync) {\r
- session.syncWrite(r);\r
- } else {\r
- session.asyncWrite(r);\r
- } \r
- }\r
- \r
- public abstract GraphRequestStatus doChanges(Graph graph) throws Exception;\r
- \r
- public void afterChanges(GraphRequestStatus status) {\r
- \r
- }\r
- \r
- public boolean canActivate() {\r
- return true;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.actions;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequest;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Session;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-\r
-\r
-public abstract class WriteInteractiveAction extends InteractiveAction {\r
- boolean sync;\r
- \r
- public WriteInteractiveAction(ThreeDimensionalEditorBase parent, boolean sync) {\r
- super(parent);\r
- this.sync = sync;\r
- }\r
- \r
- @Override\r
- public final void update(){\r
- Session session = parent.getSession();\r
- GraphRequest r = new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- doChanges(g);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- };\r
- if (sync) {\r
- session.syncWrite(r);\r
- } else {\r
- session.asyncWrite(r);\r
- } \r
- }\r
-\r
- \r
- public abstract void doChanges(Graph graph) throws Exception;\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.animation;\r
-\r
-public abstract class AbstractScalarInterpolator implements ScalarInterpolator {\r
- public void interpolate(double delta) {\r
- throw new UnsupportedOperationException("");\r
- \r
- }\r
- \r
- public void setTarget(Object target) {\r
- throw new UnsupportedOperationException("");\r
- \r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.animation;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-\r
-\r
-/**\r
- * \r
- * TODO : multiple animations\r
- * TODO : remove setRandomAnimation\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public interface Animatable {\r
- \r
- /**\r
- * Sets used animation\r
- * @param animation\r
- */\r
- public boolean setAnimation(Graph graph, Resource animation);\r
- \r
- /**\r
- * Updates animation\r
- * @param delta\r
- */\r
- public void animate(double delta, double frameTime);\r
- \r
- /**\r
- * Sets random animation\r
- * (Testing purposes)\r
- */\r
- public boolean setRandomAnimation(Graph graph);\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.animation;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-public class Animation {\r
- private List<Interpolator> interpolators = new ArrayList<Interpolator>();\r
-\r
-\r
- public void addInterpolator(Interpolator i) {\r
- interpolators.add(i);\r
- }\r
- \r
- public void removeInterpolator(Interpolator i) {\r
- interpolators.remove(i);\r
- }\r
- \r
- public void interpolate(double delta) {\r
- for (Interpolator i : interpolators) {\r
- i.interpolate(delta);\r
- }\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.animation;\r
-\r
-import org.simantics.db.Graph;\r
-\r
-\r
-public interface AnimationController {\r
- \r
- public void updateAnimation(Graph graph, double frameTime);\r
- public void setAnimatable(Animatable animatable);\r
- public void addAnimatable(Animatable animatable);\r
- public void dispose();\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.animation;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.proconf.g3d.base.ScenegraphAdapter;\r
-\r
-\r
-public class AnimationSystem {\r
- private ScenegraphAdapter adapter;\r
- private List<AnimationController> animationControllers = new ArrayList<AnimationController>();\r
- \r
- private List<AnimationSystemListener> listeners = new ArrayList<AnimationSystemListener>();\r
- \r
- private boolean pause = false;\r
- \r
- public AnimationSystem(ScenegraphAdapter adapter) {\r
- if (adapter == null)\r
- throw new IllegalArgumentException("ScenegraphAdapter must not be null");\r
- this.adapter = adapter;\r
- }\r
- \r
- public void add(AnimationController controller) {\r
- animationControllers.add(controller);\r
- for (AnimationSystemListener l : listeners)\r
- l.animationAdded(this, controller);\r
- }\r
- \r
- public void addListener(AnimationSystemListener l) {\r
- listeners.add(l);\r
- }\r
- \r
- public void removeListener(AnimationSystemListener l) {\r
- listeners.remove(l);\r
- }\r
- \r
- public boolean isRunning() {\r
- return animationControllers.size() > 0;\r
- }\r
- \r
- public void pause() {\r
- if (pause)\r
- return;\r
- pause = true;\r
- for (AnimationSystemListener l : listeners)\r
- l.animationPaused(this);\r
- }\r
- \r
- public void play() {\r
- if(!pause)\r
- return;\r
- pause = false;\r
- for (AnimationSystemListener l : listeners)\r
- l.animationPlay(this);\r
- }\r
- \r
- public void stop() {\r
- for (AnimationController c : animationControllers)\r
- c.dispose();\r
- animationControllers.clear();\r
- for (AnimationSystemListener l : listeners)\r
- l.animationStopped(this);\r
- }\r
- \r
- public boolean isPause() {\r
- return pause;\r
- }\r
- \r
- public void run(Graph graph, double frameTime) {\r
- if (pause)\r
- return;\r
- if (animationControllers.size() > 0) {\r
- for (AnimationController c : animationControllers)\r
- c.updateAnimation(graph, frameTime);\r
- adapter.setChanged(true);\r
- }\r
- }\r
- \r
- public List<AnimationController> getAnimationControllers() {\r
- return animationControllers;\r
- }\r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.animation;\r
-\r
-public interface AnimationSystemListener {\r
- public void animationStopped(AnimationSystem animationSystem);\r
- public void animationPaused(AnimationSystem animationSystem);\r
- public void animationPlay(AnimationSystem animationSystem);\r
- public void animationAdded(AnimationSystem animationSystem, AnimationController animationController);\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.animation;\r
-\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.scene.state.MaterialState;\r
-\r
-public class ChanneledColorInterpolator implements Interpolator {\r
- private ScalarInterpolator rInterpolator;\r
- private ScalarInterpolator gInterpolator;\r
- private ScalarInterpolator bInterpolator;\r
- \r
- //Material m = null;\r
- MaterialState m = null;\r
- int type = 1;\r
- \r
- public static final int AMBIENT = 0;\r
- public static final int DIFFUSE = 1;\r
- public static final int SPECULAR = 2;\r
- public static final int EMISSIVE = 3;\r
- \r
- \r
- public ChanneledColorInterpolator(ScalarInterpolator rInterpolator, ScalarInterpolator gInterpolator, ScalarInterpolator bInterpolator) {\r
- this.rInterpolator = rInterpolator;\r
- this.gInterpolator = gInterpolator;\r
- this.bInterpolator = bInterpolator;\r
- }\r
- \r
- public void interpolate(double delta) {\r
- double r = rInterpolator.evaluate(delta);\r
- double g = gInterpolator.evaluate(delta);\r
- double b = bInterpolator.evaluate(delta);\r
-\r
- ColorRGBA c = new ColorRGBA((float)r, (float)g, (float)b,0.f);\r
- switch (type) {\r
- case AMBIENT : \r
- m.setAmbient(c);\r
- break;\r
- case DIFFUSE:\r
- m.setDiffuse(c);\r
- break;\r
- case SPECULAR:\r
- m.setSpecular(c);\r
- break;\r
- case EMISSIVE:\r
- m.setEmissive(c);\r
- break;\r
- }\r
- }\r
- \r
- public void setTarget(Object target) {\r
- // m = (Material)target;\r
- m = (MaterialState)target;\r
- }\r
- \r
- public void setType(int type) {\r
- this.type = type;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.animation;\r
-\r
-\r
-import com.jme.math.Vector3f;\r
-import com.jme.scene.Node;\r
-\r
-\r
-public class ChanneledPositionInterpolator implements Interpolator {\r
- private ScalarInterpolator xInterpolator;\r
- private ScalarInterpolator yInterpolator;\r
- private ScalarInterpolator zInterpolator;\r
-\r
- Node node;\r
- \r
- public ChanneledPositionInterpolator(ScalarInterpolator xInterpolator, ScalarInterpolator yInterpolator, ScalarInterpolator zInterpolator) {\r
- this.xInterpolator = xInterpolator;\r
- this.yInterpolator = yInterpolator;\r
- this.zInterpolator = zInterpolator;\r
- }\r
- \r
- public void interpolate(double delta) {\r
- double x = xInterpolator.evaluate(delta);\r
- double y = yInterpolator.evaluate(delta);\r
- double z = zInterpolator.evaluate(delta);\r
-\r
- node.setLocalTranslation(new Vector3f((float)x,(float)y,(float)z));\r
- }\r
- \r
- public void setTarget(Object target) {\r
- node = (Node)target;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.animation;\r
-\r
-public class ConstantInterpolator extends AbstractScalarInterpolator{\r
- double constant;\r
- \r
- \r
- public ConstantInterpolator(double constant) {\r
- this.constant = constant;\r
- }\r
- \r
- public double evaluate(double delta) {\r
- return constant;\r
- }\r
- \r
- \r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.animation;\r
-\r
-public interface Interpolator {\r
- \r
- public void interpolate(double delta);\r
- public void setTarget(Object target);\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.animation;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-\r
-public class ResourceAnimationController implements AnimationController {\r
- List<Animatable> animatables = new ArrayList<Animatable>();\r
- \r
- Resource source;\r
- \r
- public ResourceAnimationController(Resource source) {\r
- this.source = source;\r
- }\r
- \r
- public void addAnimatable(Animatable animatable) {\r
- animatables.add(animatable);\r
- \r
- }\r
- \r
- public void setAnimatable(Animatable animatable) {\r
- animatables.clear();\r
- animatables.add(animatable);\r
- \r
- }\r
- \r
- protected double getValue(Graph graph) {\r
- //return PropertyUtils.getScalarDoubleValue(source);\r
- return graph.getScalarDouble(source);\r
- //source.getDoubleValue();\r
- }\r
- \r
- public void updateAnimation(Graph graph, double frameTime) {\r
- double d = getValue(graph);\r
- d = d - Math.floor(d);\r
- if (d > 1.0) {\r
- d = 1.0;\r
- } else if (d < 0.0) {\r
- d = 0.0;\r
- }\r
- for (Animatable a : animatables)\r
- a.animate(d,frameTime);\r
- }\r
- \r
- public void dispose() {\r
- \r
- }\r
- \r
- \r
- \r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.animation;\r
-\r
-public interface ScalarInterpolator extends Interpolator{\r
-\r
- public double evaluate(double delta);\r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.animation;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-\r
-public class ScaledResourceAnimationController extends ResourceAnimationController {\r
- double min;\r
- double max;\r
- double irange;\r
- \r
- public ScaledResourceAnimationController(Resource source, double min, double max) {\r
- super(source);\r
- this.max = max;\r
- this.min = min;\r
- this.irange = 1.0/(max - min);\r
- }\r
-\r
- \r
- @Override\r
- public void updateAnimation(Graph graph, double frameTime) {\r
- double d = (getValue(graph) - min) * irange;\r
- if (d > 1.0) {\r
- d = 1.0;\r
- } else if (d < 0.0) {\r
- d = 0.0;\r
- }\r
- for (Animatable a : animatables)\r
- a.animate(d,frameTime);\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.animation;\r
-\r
-import javax.vecmath.Quat4d;\r
-\r
-import org.simantics.proconf.g3d.base.VecmathJmeTools;\r
-\r
-\r
-import com.jme.scene.Node;\r
-\r
-import org.simantics.animation.curve.SlerpCurve;\r
-\r
-\r
-public class SlerpInterpolator implements Interpolator{\r
- private SlerpCurve curve;\r
- \r
- //private TransformGroup group;\r
- //private Transform3D transform;\r
- private Node node = null;\r
- \r
- public SlerpInterpolator(SlerpCurve curve) {\r
- this.curve = curve;\r
- //transform = new Transform3D();\r
- }\r
- \r
- public void interpolate(double delta) {\r
- Quat4d q = curve.evaluate(delta);\r
- //transform.set(new Quat4f(q));\r
- //group.setTransform(transform);\r
- node.setLocalRotation(VecmathJmeTools.get(q));\r
- }\r
- \r
- public void setTarget(Object target) {\r
- //group = (TransformGroup)target;\r
- node = (Node)target;\r
- }\r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.animation;\r
-\r
-import org.simantics.animation.curve.TCBCurve;\r
-\r
-\r
-public class TCBInterpolator extends AbstractScalarInterpolator{\r
- TCBCurve curve;\r
- \r
- public TCBInterpolator(TCBCurve curve) {\r
- this.curve = curve;\r
- }\r
-\r
- public double evaluate(double delta) {\r
- return curve.evaluate(delta);\r
- \r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.animation;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import org.simantics.db.Graph;\r
-\r
-public class TestAnimationController implements AnimationController {\r
- List<Animatable> animatables = new ArrayList<Animatable>();\r
- \r
- private double d = 0.0;\r
- private double delta = 0.01;\r
- \r
- public void addAnimatable(Animatable animatable) {\r
- animatables.add(animatable);\r
- \r
- }\r
- \r
- public void setAnimatable(Animatable animatable) {\r
- animatables.clear();\r
- animatables.add(animatable);\r
- \r
- }\r
- \r
- public void updateAnimation(Graph graph, double frameTime) {\r
- d += delta;\r
- if (d > 1.0) {\r
- d = 1.0;\r
- delta = -delta;\r
- } else if (d < 0.0) {\r
- delta = -delta;\r
- d = 0.0;\r
- }\r
- for (Animatable a : animatables)\r
- a.animate(d,frameTime);\r
- }\r
- \r
- public void dispose() {\r
- \r
- }\r
- \r
- \r
- \r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.animation.ui;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.simantics.proconf.g3d.Activator;\r
-import org.simantics.proconf.g3d.animation.AnimationController;\r
-import org.simantics.proconf.g3d.animation.AnimationSystem;\r
-import org.simantics.proconf.g3d.animation.AnimationSystemListener;\r
-\r
-\r
-\r
-public class AnimationControlCreator {\r
- \r
- private AnimationSystem animationSystem;\r
- \r
- public AnimationControlCreator(AnimationSystem animationSystem) {\r
- if (animationSystem == null)\r
- throw new IllegalArgumentException("AnimationSystem must not be null");\r
- this.animationSystem = animationSystem;\r
- }\r
- \r
- public Action createStopAction() {\r
- return new StopAction();\r
- }\r
- \r
- public Action createPauseAction() {\r
- return new PauseAction();\r
- }\r
- \r
- public Action createPlayAction() {\r
- return new PlayAction();\r
- }\r
- \r
- private class StopAction extends Action implements AnimationSystemListener {\r
- \r
- public StopAction() {\r
- super();\r
- this.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/silk/control_stop_blue.png"));\r
- this.setDisabledImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/silk/control_stop.png"));\r
- animationSystem.addListener(this);\r
- if (!animationSystem.isRunning())\r
- this.setEnabled(false);\r
- }\r
- \r
- public void run() {\r
- animationSystem.stop();\r
- }\r
- \r
- public void animationAdded(AnimationSystem animationSystem, AnimationController animationController) {\r
- this.setEnabled(true);\r
- }\r
- \r
- public void animationPaused(AnimationSystem animationSystem) {\r
- this.setEnabled(true);\r
- }\r
- \r
- public void animationPlay(AnimationSystem animationSystem) {\r
- this.setEnabled(true);\r
- }\r
- \r
- public void animationStopped(AnimationSystem animationSystem) {\r
- this.setEnabled(false);\r
- }\r
- }\r
- \r
- private class PlayAction extends Action implements AnimationSystemListener {\r
- \r
- public PlayAction() {\r
- super();\r
- this.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/silk/control_play_blue.png"));\r
- this.setDisabledImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/silk/control_play.png"));\r
- animationSystem.addListener(this);\r
- if (!animationSystem.isPause() || !animationSystem.isRunning())\r
- this.setEnabled(false);\r
- }\r
- \r
- public void run() {\r
- animationSystem.play();\r
- }\r
- \r
- public void animationAdded(AnimationSystem animationSystem, AnimationController animationController) {\r
- this.setEnabled(animationSystem.isPause());\r
- }\r
- \r
- public void animationPaused(AnimationSystem animationSystem) {\r
- this.setEnabled(true);\r
- }\r
- \r
- public void animationPlay(AnimationSystem animationSystem) {\r
- this.setEnabled(false);\r
- }\r
- \r
- public void animationStopped(AnimationSystem animationSystem) {\r
- this.setEnabled(false);\r
- }\r
- }\r
- \r
- private class PauseAction extends Action implements AnimationSystemListener {\r
- \r
- public PauseAction() {\r
- super();\r
- this.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/silk/control_pause_blue.png"));\r
- this.setDisabledImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/silk/control_pause.png"));\r
- animationSystem.addListener(this);\r
- if (animationSystem.isPause() || !animationSystem.isRunning())\r
- this.setEnabled(false);\r
- }\r
- \r
- public void run() {\r
- animationSystem.pause();\r
- }\r
- \r
- public void animationAdded(AnimationSystem animationSystem, AnimationController animationController) {\r
- this.setEnabled(!animationSystem.isPause());\r
- }\r
- \r
- public void animationPaused(AnimationSystem animationSystem) {\r
- this.setEnabled(false);\r
- }\r
- \r
- public void animationPlay(AnimationSystem animationSystem) {\r
- this.setEnabled(true);\r
- }\r
- \r
- public void animationStopped(AnimationSystem animationSystem) {\r
- this.setEnabled(false);\r
- }\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import java.util.Collection;\r
-\r
-import org.simantics.layer0.utils.IEntity;\r
-\r
-import com.jme.renderer.Renderer;\r
-import com.jme.scene.state.RenderState;\r
-\r
-\r
-/**\r
- * Interface for Appearance / Material\r
- * \r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public interface AppearanceProvider {\r
- \r
- /**\r
- * Used to check if GeometryProvider can generate mesh\r
- * @param instance\r
- * @return\r
- */\r
- public boolean canHandle(IEntity instance);\r
- \r
- /**\r
- * Generates mesh\r
- * @param instance\r
- * @param transform\r
- * @return\r
- */\r
- public Collection<RenderState> getAppearanceFromResource(IEntity instance, Renderer renderer);\r
- \r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.Collections;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import org.eclipse.core.runtime.CoreException;\r
-import org.eclipse.core.runtime.IConfigurationElement;\r
-import org.eclipse.core.runtime.IExtension;\r
-import org.eclipse.core.runtime.IExtensionPoint;\r
-import org.eclipse.core.runtime.Platform;\r
-import org.eclipse.core.runtime.dynamichelpers.ExtensionTracker;\r
-import org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler;\r
-import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker;\r
-import org.eclipse.core.runtime.dynamichelpers.IFilter;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-import com.jme.renderer.Renderer;\r
-import com.jme.scene.state.RenderState;\r
-\r
-public class AppearanceProviderRegistry implements IExtensionChangeHandler {\r
- private static AppearanceProviderRegistry instance;\r
- //public final static String ELEMENT_NAME = "Appearance";\r
- public final static String NAMESPACE = "org.simantics.proconf.g3d";\r
- public final static String EP_NAME = "appearance";\r
- \r
- private ExtensionTracker tracker;\r
- \r
- private List<AppearanceProviderExtension> extensions = new ArrayList<AppearanceProviderExtension>();\r
- //private Map<Resource,AppearanceProvider> providers;\r
- \r
- private AppearanceProviderRegistry() {\r
- //providers = new HashMap<Resource,AppearanceProvider>();\r
- \r
- tracker = new ExtensionTracker();\r
- \r
- IExtensionPoint ep = Platform.getExtensionRegistry().getExtensionPoint(NAMESPACE,EP_NAME);\r
- loadExtensions(ep.getConfigurationElements());\r
- \r
- IFilter filter = ExtensionTracker.createExtensionPointFilter(ep);\r
- tracker.registerHandler(this, filter);\r
- }\r
- \r
- private void close() {\r
- tracker.close();\r
- tracker = null;\r
- extensions = new ArrayList<AppearanceProviderExtension>();\r
- }\r
- \r
- public static synchronized AppearanceProviderRegistry getInstance() {\r
- if (instance==null) instance = new AppearanceProviderRegistry();\r
- return instance;\r
- }\r
- \r
- public static synchronized void dispose() {\r
- if (instance != null) {\r
- instance.close();\r
- instance = null;\r
- } \r
- }\r
- \r
- public synchronized List<AppearanceProviderExtension> getExtensions() {\r
- return Collections.unmodifiableList(extensions);\r
- }\r
- \r
- private synchronized void loadExtensions(IConfigurationElement[] elements) {\r
- for (IConfigurationElement el : elements) {\r
- String id = el.getAttribute("id");\r
- try {\r
- Object o = el.createExecutableExtension("class");\r
- AppearanceProviderExtension ext = new AppearanceProviderExtension(id,(AppearanceProvider)o);\r
- tracker.registerObject(el.getDeclaringExtension(), ext, IExtensionTracker.REF_STRONG);\r
- extensions.add(ext);\r
- } catch (CoreException e) {\r
- ErrorLogger.defaultLogError("Cannot create java interface for GeometryProvider " + id, e);\r
- }\r
- }\r
- }\r
- \r
-// private Map<Resource,AppearanceProvider> getProviderMap() {\r
-// return providers;\r
-// }\r
- \r
- public static Collection<RenderState> getAppearance(IEntity thing, Renderer renderer) {\r
- AppearanceProvider provider = getAppearanceProvider(thing);\r
- return provider.getAppearanceFromResource(thing, renderer);\r
- }\r
- \r
- public static AppearanceProvider getAppearanceProvider(IEntity thing) {\r
- //Collection<IEntity> types = thing.getRelatedObjects(thing.getGraph().getBuiltins().InstanceOf);\r
- \r
- //Resource types[] = OntologyUtils.getTypes(resource);\r
-// for (IEntity t : types) {\r
- //AppearanceProvider provider = getInstance().getProviderMap().get(t.getResource());\r
- //if (provider == null) {\r
- //for (Extension<GeometryProvider> e : getInstance().getExtensions()) {\r
- for (AppearanceProviderExtension e : getInstance().getExtensions()) {\r
- if (e.provider.canHandle(thing)) {\r
- //getInstance().getProviderMap().put(t.getResource(), e.provider);\r
- return e.provider;\r
- }\r
- }\r
- \r
-// } else {\r
-// return provider;\r
-// }\r
-// }\r
- \r
- return null;\r
- }\r
- \r
- @Override\r
- public void addExtension(IExtensionTracker tracker, IExtension extension) {\r
- loadExtensions(extension.getConfigurationElements());\r
- }\r
- \r
- @Override\r
- public synchronized void removeExtension(IExtension extension, Object[] objects) {\r
- for (Object o : objects) {\r
- AppearanceProviderExtension ext = (AppearanceProviderExtension) o;\r
- tracker.unregisterObject(extension, ext);\r
- extensions.remove(ext);\r
- }\r
- }\r
- \r
- public class AppearanceProviderExtension {\r
- public String id;\r
- public AppearanceProvider provider;\r
- \r
- public AppearanceProviderExtension(String id, AppearanceProvider provider) {\r
- this.id = id;\r
- this.provider = provider;\r
- }\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-import org.eclipse.swt.graphics.Device;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.StubLinkedList;\r
-import org.simantics.proconf.g3d.Resources;\r
-import org.simantics.proconf.g3d.stubs.Appearance;\r
-import org.simantics.proconf.g3d.stubs.Color;\r
-import org.simantics.proconf.g3d.stubs.ImageTexture;\r
-import org.simantics.proconf.g3d.stubs.Material;\r
-import org.simantics.proconf.g3d.stubs.MultiTexture;\r
-import org.simantics.proconf.g3d.stubs.MultiTextureMode;\r
-import org.simantics.proconf.g3d.stubs.Shader;\r
-import org.simantics.proconf.g3d.stubs.Texture;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-import com.jme.image.Image;\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.renderer.Renderer;\r
-import com.jme.scene.Geometry;\r
-import com.jme.scene.state.AlphaState;\r
-import com.jme.scene.state.FragmentProgramState;\r
-import com.jme.scene.state.MaterialState;\r
-import com.jme.scene.state.RenderState;\r
-import com.jme.scene.state.TextureState;\r
-import com.jme.scene.state.VertexProgramState;\r
-\r
-\r
-public class AppearanceTools {\r
- \r
- \r
- \r
- \r
- public static void setColor(Color color, org.eclipse.swt.graphics.Color c) {\r
- color.setRed(new double[]{(double)c.getRed() / 255.0});\r
- color.setGreen(new double[]{(double)c.getGreen() / 255.0});\r
- color.setBlue(new double[]{(double)c.getBlue() / 255.0});\r
- }\r
- \r
- public static org.eclipse.swt.graphics.Color getColor(Color color, Device device) {\r
- org.eclipse.swt.graphics.Color c = new org.eclipse.swt.graphics.Color(device, (int)(color.getRed()[0] * 255.0), (int)(color.getGreen()[0] * 255.0),(int)(color.getBlue()[0] * 255.0));\r
- return c;\r
- }\r
- \r
- /**\r
- * Returns collection of renderstates that represent the given appearance.\r
- * Note : if collection contains an alphastate, node must be inserted to transparent rendering queue.!\r
- * @param appearance\r
- * @param renderer\r
- * @return\r
- */\r
- public static Collection<RenderState> getAppearance(Appearance appearance, Renderer renderer) {\r
- Material m = appearance.getMaterial();\r
- List <RenderState> states = new ArrayList<RenderState>();\r
- if (m != null) {\r
- states.addAll(getMaterial(m, renderer));\r
- }\r
- Texture t = appearance.getTexture();\r
- if (t != null) {\r
- if (t.isInstanceOf(Resources.g3dResource.ImageTexture)) {\r
- states.addAll(getPatternTexture(t, renderer));\r
- } else if (t.isInstanceOf(Resources.g3dResource.Texture3D)) {\r
- ErrorLogger.getDefault().logWarning("JME doesn't support volume textures!", null);\r
- } else if (t.isInstanceOf(Resources.g3dResource.MultiTexture)) {\r
- states.addAll(getMultiTexture(t, renderer));\r
- } else if (t.isInstanceOf(Resources.g3dResource.CubeMapTexture)) {\r
- ErrorLogger.getDefault().logWarning("JME doesn't support cubemap textures!", null); \r
- } else {\r
- throw new UnsupportedOperationException("Unsupported texture");\r
- }\r
- }\r
- Shader s = appearance.getShader();\r
- if (s != null) {\r
- states.addAll(getShader(s, renderer));\r
- }\r
- return states;\r
- \r
- }\r
- \r
- private static ColorRGBA getJMEColor(Color color) {\r
- return new ColorRGBA((float)color.getRed()[0],(float)color.getGreen()[0],(float)color.getBlue()[0],0.f);\r
- }\r
- \r
- private static ColorRGBA getJMEColor(Color color, float alpha) {\r
- return new ColorRGBA((float)color.getRed()[0],(float)color.getGreen()[0],(float)color.getBlue()[0],alpha);\r
- }\r
- \r
- private static Collection<RenderState> getMaterial(Material m , Renderer renderer) {\r
- float alpha = 0.f;\r
- MaterialState ms = renderer.createMaterialState();\r
- List<RenderState> states = new ArrayList<RenderState>();\r
- if (m.getTransparency()[0] > 0.0) {\r
- AlphaState as = renderer.createAlphaState();\r
- as.setBlendEnabled(true);\r
- as.setSrcFunction(AlphaState.DB_SRC_ALPHA);\r
- as.setDstFunction(AlphaState.DB_ONE_MINUS_SRC_ALPHA);\r
- states.add(as);\r
- alpha = 1.f - (float)m.getTransparency()[0];\r
- //node.setRenderQueueMode(Renderer.QUEUE_TRANSPARENT);\r
- ms.setMaterialFace(MaterialState.MF_FRONT_AND_BACK);\r
- } else {\r
- //node.setRenderQueueMode(Renderer.QUEUE_OPAQUE);\r
- }\r
- \r
- ms.setEmissive(getJMEColor(m.getEmissiveColor()));\r
- ms.setSpecular(getJMEColor(m.getSpecularColor()));\r
- ms.setAmbient(getJMEColor(m.getAmbientColor()));\r
- ms.setDiffuse(getJMEColor(m.getDiffuseColor(),alpha));\r
- ms.setShininess((float) m.getShininess()[0]); \r
- //node.setRenderState(ms);\r
- states.add(ms);\r
- return states; \r
- }\r
- \r
- private static Collection<RenderState> getShader(Shader s , Renderer renderer) {\r
- List<RenderState> states = new ArrayList<RenderState>();\r
- VertexProgramState vs = renderer.createVertexProgramState();\r
- vs.load(s.getVertexShader()[0]);\r
- FragmentProgramState fs = renderer.createFragmentProgramState();\r
- fs.load(s.getFragmentShader()[0]);\r
- states.add(vs);\r
- states.add(fs);\r
- return states;\r
- }\r
- \r
- private static Collection<RenderState> getPatternTexture(Texture t, Renderer renderer) {\r
-\r
- List<RenderState> states = new ArrayList<RenderState>();\r
- com.jme.image.Texture texture = ResourceTextureCache.getInstance().loadTexture(t.getGraph(), t.getResource());\r
- if (texture == null)\r
- return states;\r
- TextureState state = renderer.createTextureState();\r
- state.setTexture(texture);\r
- state.setEnabled(true);\r
- states.add(state);\r
- return states;\r
- \r
- }\r
- \r
- private static Image getPatternTexture(ImageTexture t) {\r
- return ResourceTextureCache.getInstance().loadImage(t.getGraph(), t.getResource());\r
- }\r
- \r
- \r
- \r
- \r
- \r
- private static Collection<RenderState> getMultiTexture(Texture t, Renderer renderer) {\r
- List<RenderState> states = new ArrayList<RenderState>();\r
- TextureState state = renderer.createTextureState();\r
- MultiTexture t3 = new MultiTexture(t); \r
- Collection<IEntity> mtList = t3.getRelatedObjects(Resources.g3dResource.HasMultiTextureElementList);\r
- assert (mtList.size() == 1); //this is required in the ontology!\r
- StubLinkedList<IEntity> list = new StubLinkedList<IEntity>(mtList.iterator().next());\r
- \r
- for (int i = 0; i < list.size(); i++) {\r
- IEntity ie = list.get(i);\r
- //MultiTextureElement e = new MultiTextureElement(ie);\r
- Texture tex = new Texture(ie); //e.getTexture();\r
- MultiTextureMode mode = tex.getTextureMode();//e.getTextureMode();\r
- com.jme.image.Texture texture = new com.jme.image.Texture();\r
- texture.setFilter(com.jme.image.Texture.FM_LINEAR);\r
- texture.setMipmapState(com.jme.image.Texture.MM_LINEAR_LINEAR);\r
- texture.setWrap(com.jme.image.Texture.WM_WRAP_S_WRAP_T);\r
- if (mode.getResource().equals(Resources.g3dResource.MultiTextureMode_add)) {\r
- texture.setApply(com.jme.image.Texture.AM_ADD);\r
- } else if (mode.getResource().equals(Resources.g3dResource.MultiTextureMode_modulate)) {\r
- texture.setApply(com.jme.image.Texture.AM_MODULATE);\r
- } else if (mode.getResource().equals(Resources.g3dResource.MultiTextureMode_decal)) {\r
- texture.setApply(com.jme.image.Texture.AM_DECAL);\r
- } else if (mode.getResource().equals(Resources.g3dResource.MultiTextureMode_blend)) {\r
- texture.setApply(com.jme.image.Texture.AM_BLEND);\r
- } else if (mode.getResource().equals(Resources.g3dResource.MultiTextureMode_replace)) {\r
- texture.setApply(com.jme.image.Texture.AM_REPLACE);\r
- } else if (mode.getResource().equals(Resources.g3dResource.MultiTextureMode_combine)) {\r
- texture.setApply(com.jme.image.Texture.AM_COMBINE);\r
- //CombineMode cm = e.getCombineMode();\r
- //CombineSource cs = e.getCombineSource();\r
- StubLinkedList<IEntity> combine = new StubLinkedList<IEntity>(tex.getCombineDefinition());\r
- setCombineAttributes(texture, combine);\r
- \r
- \r
- \r
- //att.setBlendColor(blendColor)\r
- //att.setTexBlendColor(texBlendColor)\r
- //att.setTextureBlendColor(color)\r
- //att.setTextureTransform(transform)\r
- } else {\r
- throw new UnsupportedOperationException("Texture mode not supported");\r
- }\r
- \r
- \r
- if (tex.isInstanceOf(Resources.g3dResource.MultiTexture)) {\r
- ErrorLogger.defaultLogError("MultiTexture contains another MultiTexture which is not allowed", null);\r
- continue;\r
- } else if (tex.isInstanceOf(Resources.g3dResource.ImageTexture)) {\r
- Image image = getPatternTexture(new ImageTexture(tex));\r
- if (image != null)\r
- texture.setImage(image);\r
- \r
- } else if (tex.isInstanceOf(Resources.g3dResource.Texture3D)) {\r
- ErrorLogger.getDefault().logWarning("JME doesn't support volume textures!", null);\r
- \r
- } else if (tex.isInstanceOf(Resources.g3dResource.CubeMapTexture)) {\r
- ErrorLogger.getDefault().logWarning("JME doesn't support cubemap textures!", null); \r
- \r
- } else {\r
- throw new UnsupportedOperationException("Unsupported texture");\r
- }\r
-\r
- state.setTexture(texture, i);\r
- }\r
- states.add(state);\r
- return states;\r
- \r
- //MultiTextureElementList texturesList = t3.getMultiTextureElementList();\r
- //List<MultiTextureElement> textures = texturesList.toStandAloneList();\r
- //ArrayList<TextureUnitState> states = new ArrayList<TextureUnitState>();\r
- // for (MultiTextureElement e : textures) {\r
- // Texture tex = e.getTexture();\r
- \r
- //int index = e.getMultiTextureIndexValue();\r
- //String mode = e.getMultiTextureModeValue();\r
- \r
- // com.jme.image.Texture texture = new com.jme.image.Texture();\r
- // texture.setFilter(com.jme.image.Texture.FM_LINEAR);\r
- // texture.setMipmapState(com.jme.image.Texture.MM_LINEAR_LINEAR);\r
- // texture.setWrap(com.jme.image.Texture.WM_WRAP_S_WRAP_T);\r
-// if (mode.startsWith(TEXTURE_MODE_MODULATE)) {\r
-// texture.setApply(com.jme.image.Texture.AM_MODULATE);\r
-// } else if (mode.startsWith(TEXTURE_MODE_DECAL)) {\r
-// texture.setCombineFuncRGB(com.jme.image.Texture.AM_DECAL);\r
-// } else if (mode.startsWith(TEXTURE_MODE_BLEND)) {\r
-// texture.setCombineFuncRGB(com.jme.image.Texture.AM_MODULATE);\r
-// } else if (mode.startsWith(TEXTURE_MODE_REPLACE)) {\r
-// texture.setCombineFuncRGB(com.jme.image.Texture.AM_REPLACE);\r
-// } else if (mode.startsWith(TEXTURE_MODE_COMBINE)) {\r
-// texture.setCombineFuncRGB(com.jme.image.Texture.AM_COMBINE);\r
-// \r
-// mode = mode.substring(TEXTURE_MODE_COMBINE.length()+1); \r
-// setCombineAttributes(texture, mode);\r
- \r
- \r
- \r
- //att.setBlendColor(blendColor)\r
- //att.setTexBlendColor(texBlendColor)\r
- //att.setTextureBlendColor(color)\r
- //att.setTextureTransform(transform)\r
-// } else {\r
-// throw new UnsupportedOperationException("Texture mode not supported");\r
-// }\r
-// \r
-// \r
-// if (tex.isInstanceOf(Resources.g3dResource.MultiTexture)) {\r
-// ErrorLogger.defaultLogError("MultiTexture contains another MultiTexture which is not allowed", null);\r
-// continue;\r
-// } else if (tex.isInstanceOf(Resources.g3dResource.ImageTexture)) {\r
-// Image image = getPatternTexture(ImageTextureFactory.create(tex));\r
-// if (image != null)\r
-// texture.setImage(image);\r
-//\r
-// } else if (tex.isInstanceOf(Resources.g3dResource.Texture3D)) {\r
-// ErrorLogger.getDefault().logWarning("JME doesn't support volume textures!", null);\r
-//\r
-// } else if (tex.isInstanceOf(Resources.g3dResource.CubeMapTexture)) {\r
-// ErrorLogger.getDefault().logWarning("JME doesn't support cubemap textures!", null); \r
-//\r
-// } else {\r
-// throw new UnsupportedOperationException("Unsupported texture");\r
-// }\r
- \r
- //FIXME !\r
- //state.setTexture(texture, index);\r
- // }\r
- // node.setRenderState(state);\r
- \r
- \r
-\r
- }\r
- \r
- \r
- private static void setCombineAttributes(com.jme.image.Texture texture, StubLinkedList<IEntity> definition) {\r
- // TODO : rgb and alpha scale\r
- Iterator<IEntity> it = definition.iterator();\r
- IEntity mode = it.next();\r
- if (mode.getResource().equals(Resources.g3dResource.CombineMode_add)) {\r
- texture.setCombineFuncRGB(com.jme.image.Texture.ACF_ADD);\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineMode_addsigned)) {\r
- texture.setCombineFuncRGB(com.jme.image.Texture.ACF_ADD_SIGNED);\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineMode_dot3)) {\r
- texture.setCombineFuncRGB(com.jme.image.Texture.ACF_DOT3_RGB);\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineMode_interpolate)) {\r
- texture.setCombineFuncRGB(com.jme.image.Texture.ACF_INTERPOLATE);\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineMode_modulate)) {\r
- texture.setCombineFuncRGB(com.jme.image.Texture.ACF_MODULATE);\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineMode_replace)) {\r
- texture.setCombineFuncRGB(com.jme.image.Texture.ACF_REPLACE);\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineMode_subtract)) {\r
- texture.setCombineFuncRGB(com.jme.image.Texture.ACF_SUBTRACT);\r
- } else {\r
- throw new UnsupportedOperationException("Unsupported combine mode");\r
- }\r
- mode = it.next();\r
- int i = 0;\r
- for (i = 0; i < 3; i++) {\r
- int m;\r
- if (mode.getResource().equals(Resources.g3dResource.CombineSource_constantcolor)) {\r
- m = com.jme.image.Texture.ACS_CONSTANT;\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineSource_objectcolor)) {\r
- m = com.jme.image.Texture.ACS_PRIMARY_COLOR;\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineSource_previousstate)) {\r
- m = com.jme.image.Texture.ACS_TEXTURE;\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineSource_texturecolor)) {\r
- m = com.jme.image.Texture.ACS_TEXTURE;\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineSource_texture0)) {\r
- m = com.jme.image.Texture.ACS_TEXTURE;\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineSource_texture1)) {\r
- m = com.jme.image.Texture.ACS_TEXTURE;\r
- } else {\r
- break;\r
- //throw new UnsupportedOperationException("Texture combine source not supported");\r
- }\r
- mode = it.next();\r
- switch (i) {\r
- case 0:\r
- texture.setCombineSrc0RGB(m);\r
- break;\r
- case 1:\r
- texture.setCombineSrc1RGB(m);\r
- break;\r
- case 2:\r
- texture.setCombineSrc2RGB(m);\r
- break;\r
- \r
- }\r
- }\r
- if (i > 0) {\r
- for (i = 0; i < 3; i++) {\r
- int m;\r
- if (mode.getResource().equals(Resources.g3dResource.CombineFunction_srccolor)) {\r
- m = com.jme.image.Texture.ACO_SRC_COLOR;\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineFunction_srcalpha)) {\r
- m = com.jme.image.Texture.ACO_SRC_ALPHA;\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineFunction_oneminussrccolor)) {\r
- m = com.jme.image.Texture.ACO_ONE_MINUS_SRC_COLOR;\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineFunction_oneminussrcalpha)) {\r
- m = com.jme.image.Texture.ACO_ONE_MINUS_SRC_ALPHA;\r
- } else {\r
- break;\r
- }\r
- mode = it.next();\r
- switch (i) {\r
- case 0:\r
- texture.setCombineOp0RGB(m);\r
- break;\r
- case 1:\r
- texture.setCombineOp1RGB(m);\r
- break;\r
- case 2:\r
- texture.setCombineOp2RGB(m);\r
- break;\r
- \r
- }\r
- }\r
- }\r
- \r
- for (i = 0; i < 3; i++) {\r
- int m;\r
- if (mode.getResource().equals(Resources.g3dResource.CombineSource_constantcolor)) {\r
- m = com.jme.image.Texture.ACS_CONSTANT;\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineSource_objectcolor)) {\r
- m = com.jme.image.Texture.ACS_PRIMARY_COLOR;\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineSource_previousstate)) {\r
- m = com.jme.image.Texture.ACS_TEXTURE;\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineSource_texturecolor)) {\r
- m = com.jme.image.Texture.ACS_TEXTURE;\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineSource_texture0)) {\r
- m = com.jme.image.Texture.ACS_TEXTURE;\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineSource_texture1)) {\r
- m = com.jme.image.Texture.ACS_TEXTURE;\r
- } else {\r
- break;\r
- //throw new UnsupportedOperationException("Texture combine source not supported");\r
- }\r
- mode = it.next();\r
- switch (i) {\r
- case 0:\r
- texture.setCombineSrc0Alpha(m);\r
- break;\r
- case 1:\r
- texture.setCombineSrc1Alpha(m);\r
- break;\r
- case 2:\r
- texture.setCombineSrc2Alpha(m);\r
- break;\r
- \r
- }\r
- }\r
- if (i > 0) {\r
- for (i = 0; i < 3; i++) {\r
- int m;\r
- if (mode.getResource().equals(Resources.g3dResource.CombineFunction_srccolor)) {\r
- m = com.jme.image.Texture.ACO_SRC_COLOR;\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineFunction_srcalpha)) {\r
- m = com.jme.image.Texture.ACO_SRC_ALPHA;\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineFunction_oneminussrccolor)) {\r
- m = com.jme.image.Texture.ACO_ONE_MINUS_SRC_COLOR;\r
- } else if (mode.getResource().equals(Resources.g3dResource.CombineFunction_oneminussrcalpha)) {\r
- m = com.jme.image.Texture.ACO_ONE_MINUS_SRC_ALPHA;\r
- } else {\r
- break;\r
- }\r
- mode = it.next();\r
- switch (i) {\r
- case 0:\r
- texture.setCombineOp0Alpha(m);\r
- break;\r
- case 1:\r
- texture.setCombineOp1Alpha(m);\r
- break;\r
- case 2:\r
- texture.setCombineOp2Alpha(m);\r
- break;\r
- \r
- }\r
- }\r
- }\r
- }\r
- \r
- public static void copyMaterial(Geometry from, Geometry to) {\r
- for (int i = RenderState.RS_ALPHA; i < RenderState.RS_MAX_STATE; i++) {\r
- RenderState rs = from.getRenderState(i);\r
- if (rs != null)\r
- to.setRenderState(rs);\r
- }\r
- \r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-public class Constraint {\r
- \r
- public Constraint() {\r
- points = new ArrayList<Point3d>();\r
- dirs = new ArrayList<Vector3d>();\r
- }\r
- \r
- public List<Point3d> points;\r
- public List<Vector3d> dirs;\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestWithResult;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.adaption.AdaptionException;\r
-import org.simantics.proconf.g3d.Resources;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.scene.Geometry;\r
-import com.jme.scene.Line;\r
-import com.jme.scene.state.MaterialState;\r
-import com.jme.util.geom.BufferUtils;\r
-\r
-public class ConstraintDetector {\r
- \r
- private static final int X = 0;\r
- private static final int Y = 1;\r
- private static final int Z = 2;\r
- \r
- \r
- private ThreeDimensionalEditorBase editor;\r
- //private G3DNode constraintReference = null;\r
- private Resource constraintReference = null;\r
- private ArrayList<Point3d> constraintPoints = new ArrayList<Point3d>();\r
- private ArrayList<Vector3d> constraintDirections = new ArrayList<Vector3d>();\r
- private MaterialState ms;\r
- \r
- private ColorRGBA xColor = new ColorRGBA(1.f,0.f,0.f,1.f);\r
- private ColorRGBA yColor = new ColorRGBA(0.f,1.f,0.f,1.f);\r
- private ColorRGBA zColor = new ColorRGBA(0.f,0.f,1.f,1.f);\r
- \r
- \r
- public ConstraintDetector(ThreeDimensionalEditorBase editor) {\r
- this.editor = editor;\r
- ms = editor.getRenderingComponent().getDisplaySystem().getRenderer().createMaterialState();\r
- ms.setEmissive(new ColorRGBA(1.f,1.f,1.f,1.f));\r
- ms.setColorMaterial(MaterialState.CM_EMISSIVE);\r
- }\r
- \r
-\r
- public void clearConstraints() {\r
- //System.out.println("ConstraintDetector.clearConstraints()");\r
- constraintPoints.clear();\r
- constraintDirections.clear();\r
- }\r
- \r
- private void updateConstraints() {\r
- clearConstraints();\r
- if (constraintReference == null)\r
- return;\r
- GraphRequestWithResult<Constraint> request = new GraphRequestWithResult<Constraint>() {\r
- @Override\r
- public Constraint performWithResult(Graph g) throws Exception {\r
- try {\r
- return g.adapt(constraintReference, Resources.g3dResource.HasConstraints);\r
- } catch (AdaptionException e) {\r
- ErrorLogger.defaultLogWarning("Cannot add constraint", e);\r
- return null;\r
- }\r
- }\r
- };\r
- editor.getSession().syncRead(request);\r
- Constraint c = request.getResult();\r
- if (c == null)\r
- return;\r
- constraintPoints.addAll(c.points);\r
- constraintDirections.addAll(c.dirs);\r
- }\r
- \r
- \r
- public ArrayList<Point3d> getConstraintPoints() {\r
- return constraintPoints;\r
- }\r
- \r
- public ArrayList<Vector3d> getConstraintDirections() {\r
- return constraintDirections;\r
- }\r
-\r
- public void updateConstraintReference() {\r
- \r
- Resource interactive = null;\r
- if (editor.getSelectionAdapter().getHighlightSelection().size() > 0) {\r
- interactive = editor.getSelectionAdapter().getInteractiveSelectedObjects().iterator().next().getResource();\r
- if (constraintReference == null) {\r
- constraintReference = interactive;\r
- updateConstraints();\r
- } else if (!constraintReference.getResource().equals(interactive.getResource())) {\r
- constraintReference = interactive;\r
- updateConstraints();\r
- }\r
- } else {\r
- constraintReference = null;\r
- updateConstraints();\r
- }\r
-\r
- }\r
- \r
- public void addContraintPoint(Point3d p) {\r
- //System.out.println("ConstraintDetector.addConstraintPoint() " + p);\r
- constraintPoints.add(p);\r
- }\r
- \r
- public void addContraintDirection(Vector3d v) {\r
- //System.out.println("ConstraintDetector.addConstraintDirection() " + v);\r
- constraintDirections.add(v);\r
- }\r
- \r
- private double snapAngle = 0.1;\r
- private String snapString = "";\r
-\r
- private ArrayList<Geometry> constraintHighlights = new ArrayList<Geometry>();\r
- \r
- public Point3d getSnappedPoint(Vector3d pickPoint, Vector3d pickDir, Vector3d requestedPoint) {\r
- \r
- \r
- Vector3d snappedPoint = new Vector3d();\r
- Vector3d t = new Vector3d();\r
- Point3d currentPoint = null;\r
- // TODO : snap to closest angle\r
- for (Vector3d constraintDir : constraintDirections) {\r
- \r
- MathTools.intersectStraightStraight(pickPoint,pickDir, requestedPoint, constraintDir, t, snappedPoint);\r
- t.sub(snappedPoint);\r
- if (t.lengthSquared() < snapAngle) {\r
- \r
- snapString += "Angle snap ";\r
- currentPoint = new Point3d(snappedPoint);\r
- break;\r
- }\r
- }\r
- if (currentPoint != null) {\r
- Vector3d dir = new Vector3d(currentPoint);\r
- dir.sub(requestedPoint);\r
- Point3d p = getPointSnap(requestedPoint, dir);\r
- if (p != null)\r
- currentPoint = p;\r
- } else {\r
- List<Double> distances = new ArrayList<Double>();\r
- List<Point3d> snapPoints = new ArrayList<Point3d>();\r
- List<String> snapStrings = new ArrayList<String>();\r
- List<ColorRGBA> snapColors = new ArrayList<ColorRGBA>();\r
- for (Point3d constraintPoint : constraintPoints) {\r
- distances.clear();\r
- snapPoints.clear();\r
- snapStrings.clear();\r
- MathTools.intersectStraightStraight(new Vector3d(constraintPoint), new Vector3d(1.0, 0.0, 0.0),\r
- pickPoint, pickDir, snappedPoint, t);\r
- t.sub(snappedPoint);\r
- double distance = t.lengthSquared();\r
- if (distance < snapAngle) {\r
- distances.add(distance);\r
- snapPoints.add(new Point3d(snappedPoint));\r
- snapStrings.add("Point x-snap ");\r
- snapColors.add(xColor);\r
- }\r
- MathTools.intersectStraightStraight(new Vector3d(constraintPoint), new Vector3d(0.0, 1.0, 0.0),\r
- pickPoint, pickDir, snappedPoint, t);\r
- t.sub(snappedPoint);\r
- distance = t.lengthSquared();\r
- if (distance < snapAngle) {\r
- distances.add(distance);\r
- snapPoints.add(new Point3d(snappedPoint));\r
- snapStrings.add("Point y-snap ");\r
- snapColors.add(yColor);\r
- }\r
- MathTools.intersectStraightStraight(new Vector3d(constraintPoint), new Vector3d(0.0, 0.0, 1.0),\r
- pickPoint, pickDir, snappedPoint, t);\r
- t.sub(snappedPoint);\r
- distance = t.lengthSquared();\r
- if (distance < snapAngle) {\r
- distances.add(distance);\r
- snapPoints.add(new Point3d(snappedPoint));\r
- snapStrings.add("Point z-snap ");\r
- snapColors.add(zColor);\r
- \r
- }\r
- if (distances.size() > 0) {\r
- if (distances.size() > 1) {\r
- // more than one axes snape\r
- Vector3d ref = MathTools.closestPointOnStraight(constraintPoint, new Point3d(pickPoint), pickDir);\r
- ref.sub(constraintPoint);\r
- distance = ref.lengthSquared();\r
- if (distance < snapAngle) {\r
- // we are close enought to point, so we'll just snap there\r
- currentPoint = new Point3d(constraintPoint);\r
- snapString += "Point snap ";\r
- } else {\r
- // select the closest of axes snap to\r
- int min = 0;\r
- for (int i = 1; i < distances.size(); i++) {\r
- if (distances.get(i) < distances.get(min))\r
- min = i;\r
- }\r
- currentPoint = snapPoints.get(min);\r
- addConstrainLineHighlight(currentPoint, constraintPoint,snapColors.get(min));\r
- snapString += snapStrings.get(min);\r
- }\r
- } else {\r
- // only one of the axes snaps\r
- currentPoint = snapPoints.get(0);\r
- addConstrainLineHighlight(currentPoint, constraintPoint,snapColors.get(0));\r
- snapString += snapStrings.get(0);\r
- }\r
- break;\r
- }\r
- }\r
- }\r
- return currentPoint;\r
-\r
- }\r
- \r
- public void clearConstraintHighlights() {\r
- snapString = "";\r
-\r
- for (Geometry s : constraintHighlights)\r
- s.removeFromParent();\r
- \r
- constraintHighlights.clear();\r
- }\r
- \r
- private void addConstrainLineHighlight(Point3d p1, Point3d p2, ColorRGBA color) {\r
-\r
- float coord[] = new float[6];\r
- ColorRGBA colors[] = new ColorRGBA[2];\r
- colors[0] = color;\r
- colors[1] = color;\r
- coord[0] = (float)p1.x;\r
- coord[1] = (float)p1.y;\r
- coord[2] = (float)p1.z;\r
- coord[3] = (float)p2.x;\r
- coord[4] = (float)p2.y;\r
- coord[5] = (float)p2.z;\r
- Line shape = new Line("",BufferUtils.createFloatBuffer(coord),null,BufferUtils.createFloatBuffer(colors),null);\r
- editor.getRenderingComponent().getNoShadowRoot().attachChild(shape);\r
- shape.setRenderState(ms);\r
- constraintHighlights.add(shape);\r
- }\r
- \r
- private void addConstrainPlaneHighlight(Point3d p1, Point3d p2, int axis) {\r
-\r
- float coord[] = new float[9];\r
- ColorRGBA colors[] = new ColorRGBA[3];\r
- coord[0] = (float)p1.x;\r
- coord[1] = (float)p1.y;\r
- coord[2] = (float)p1.z;\r
- switch (axis) {\r
- case X:\r
- coord[3] = (float)p1.x;\r
- coord[4] = (float)p1.y;\r
- coord[5] = (float)p2.z;\r
- colors[0] = colors[1] = colors[2] = xColor;\r
- break;\r
- case Y:\r
- coord[3] = (float)p1.x;\r
- coord[4] = (float)p1.y;\r
- coord[5] = (float)p2.z;\r
- colors[0] = colors[1] = colors[2] = yColor;\r
- break;\r
- case Z:\r
- coord[3] = (float)p1.x;\r
- coord[4] = (float)p2.y;\r
- coord[5] = (float)p2.z;\r
- colors[0] = colors[1] = colors[2] = zColor;\r
- break;\r
- \r
- }\r
- coord[6] = (float)p2.x;\r
- coord[7] = (float)p2.y;\r
- coord[8] = (float)p2.z;\r
- Line shape = new Line("",BufferUtils.createFloatBuffer(coord),null,BufferUtils.createFloatBuffer(colors),null);\r
- shape.setMode(Line.CONNECTED);\r
- editor.getRenderingComponent().getNoShadowRoot().attachChild(shape);\r
- shape.setRenderState(ms);\r
- constraintHighlights.add(shape);\r
- }\r
- \r
- /**\r
- * Snaps position to axis-aligned planes defined by constraint points\r
- * Form of position is p+v, meaning that the position that is snapped is requestedPoint + requestedDir\r
- * @param requestedPoint one part of the position to be snapped\r
- * @param requestedDir second part of the position to be snapped and direction that the position is allowed to move\r
- * @return\r
- */\r
- public Point3d getPointSnap(Vector3d requestedPoint, Vector3d requestedDir) {\r
- \r
- Vector3d snappedPoint = new Vector3d();\r
- Point3d currentPoint = null;\r
- double u[] = new double[1];\r
- List<Point3d> p1s = new ArrayList<Point3d>();\r
- List<Point3d> p2s = new ArrayList<Point3d>();\r
- List<Integer> axes = new ArrayList<Integer>();\r
- \r
- for (Point3d constraintPoint : constraintPoints) {\r
- boolean snap = false;\r
- \r
- if (MathTools.intersectStraightPlane(requestedPoint, requestedDir, new Vector3d(constraintPoint), getAxialVector(X), snappedPoint,u) && Math.abs(1.0 - u[0]) < snapAngle) {\r
- currentPoint = new Point3d(snappedPoint);\r
- //snapString += "Point/Plane x-snap ";\r
- snap = true;\r
- //addConstrainPlaneHighlight(constraintPoint, currentPoint,X);\r
- p1s.add(constraintPoint);\r
- p2s.add(currentPoint);\r
- axes.add(X);\r
- }\r
- \r
- if (MathTools.intersectStraightPlane(requestedPoint, requestedDir, new Vector3d(constraintPoint), getAxialVector(Y), snappedPoint,u) && Math.abs(1.0 - u[0]) < snapAngle) {\r
- currentPoint = new Point3d(snappedPoint);\r
- //snapString += "Point/Plane y-snap ";\r
- snap = true;\r
- //addConstrainPlaneHighlight(constraintPoint, currentPoint,Y);\r
- p1s.add(constraintPoint);\r
- p2s.add(currentPoint);\r
- axes.add(Y);\r
- }\r
- \r
- if (MathTools.intersectStraightPlane(requestedPoint, requestedDir, new Vector3d(constraintPoint), getAxialVector(Z), snappedPoint,u) && Math.abs(1.0 - u[0]) < snapAngle) {\r
- currentPoint = new Point3d(snappedPoint);\r
- //snapString += "Point/Plane z-snap ";\r
- snap = true;\r
- //addConstrainPlaneHighlight(constraintPoint, currentPoint,Z);\r
- p1s.add(constraintPoint);\r
- p2s.add(currentPoint);\r
- axes.add(Z);\r
- }\r
- if (snap)\r
- break;\r
- }\r
- if (p1s.size() == 0)\r
- return null;\r
- if (p1s.size() == 1) {\r
- snapString += "Point/Plane ";\r
- switch (axes.get(0)) {\r
- case X:\r
- snapString += "x";\r
- break;\r
- case Y:\r
- snapString += "y";\r
- break;\r
- case Z:\r
- snapString += "z";\r
- break;\r
- }\r
- snapString += "-snap ";\r
- addConstrainPlaneHighlight(p1s.get(0), p2s.get(0),axes.get(0));\r
- return currentPoint;\r
- } else if (p1s.size() == 3){\r
- // all axial planes are intersecting, snapping point must be the constraint point\r
- // all constraint points are the same, so just pick the first in the list\r
- snapString += "Point/Point ";\r
- return p1s.get(0);\r
- } else {\r
- Vector3d dir = new Vector3d();\r
- dir.cross(getAxialVector(axes.get(0)), getAxialVector(axes.get(1)));\r
- currentPoint = new Point3d(MathTools.closestPointOnStraight(currentPoint, p1s.get(0), dir));\r
- addConstrainLineHighlight(p1s.get(0), currentPoint, xColor);\r
- snapString += "Point/Line ";\r
- return currentPoint;\r
- }\r
- \r
- }\r
- \r
- private Vector3d getAxialVector(int axis) {\r
- switch (axis) {\r
- case X:\r
- return new Vector3d(1.0,0.0,0.0);\r
- case Y:\r
- return new Vector3d(0.0,1.0,0.0);\r
- case Z:\r
- return new Vector3d(0.0,0.0,1.0);\r
- }\r
- throw new RuntimeException("Unknown axis " + axis); \r
- }\r
- \r
- /**\r
- * Snaps the position to axis-aligned planes defined by constraint points\r
- * @param requestedPoint point that is snapped\r
- * @param requestedDir direction that point is allowed to move\r
- * @return\r
- */\r
- \r
- public Point3d getPointSnap2(Vector3d requestedPoint, Vector3d requestedDir) {\r
- \r
- Vector3d snappedPoint = new Vector3d();\r
- Point3d currentPoint = null;\r
- double u[] = new double[1];\r
- //System.out.println(requestedPoint + " " + requestedDir);\r
- for (Point3d constraintPoint : constraintPoints) {\r
- boolean snap = false;\r
- //System.out.print(constraintPoint + " ");\r
- if (MathTools.intersectStraightPlane(requestedPoint, requestedDir, new Vector3d(constraintPoint), new Vector3d(1.0,0.0,0.0), snappedPoint,u) && Math.abs(u[0]) < snapAngle) {\r
- currentPoint = new Point3d(snappedPoint);\r
- snapString += "Point/Plane x-snap ";\r
- snap = true;\r
- addConstrainPlaneHighlight(constraintPoint, currentPoint,X);\r
- //System.out.print(" x " + u[0]);\r
- }\r
- \r
- if (MathTools.intersectStraightPlane(requestedPoint, requestedDir, new Vector3d(constraintPoint), new Vector3d(0.0,1.0,0.0), snappedPoint,u) && Math.abs(u[0]) < snapAngle) {\r
- currentPoint = new Point3d(snappedPoint);\r
- snapString += "Point/Plane y-snap ";\r
- snap = true;\r
- addConstrainPlaneHighlight(constraintPoint, currentPoint,Y);\r
- //System.out.print(" y " + u[0]);\r
- }\r
- \r
- \r
- if (MathTools.intersectStraightPlane(requestedPoint, requestedDir, new Vector3d(constraintPoint), new Vector3d(0.0,0.0,1.0), snappedPoint,u) && Math.abs(u[0]) < snapAngle) {\r
- currentPoint = new Point3d(snappedPoint);\r
- snapString += "Point/Plane z-snap ";\r
- snap = true;\r
- addConstrainPlaneHighlight(constraintPoint, currentPoint,Z);\r
- //System.out.print(" z " + u[0]);\r
- }\r
- //System.out.println();\r
- if (snap)\r
- break;\r
- }\r
- return currentPoint;\r
- }\r
- \r
- public String getSnapString() {\r
- return snapString;\r
- }\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import java.util.Collection;\r
-\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.proconf.g3d.Resources;\r
-import org.simantics.proconf.g3d.stubs.Appearance;\r
-\r
-import com.jme.renderer.Renderer;\r
-import com.jme.scene.state.RenderState;\r
-\r
-public class DefaultAppearanceProvider implements AppearanceProvider {\r
- \r
- \r
-\r
- @Override\r
- public boolean canHandle(IEntity instance) {\r
- return instance.hasStatement(Resources.g3dResource.HasAppearance);\r
- }\r
- \r
- @Override\r
- public Collection<RenderState> getAppearanceFromResource(IEntity instance, Renderer renderer) {\r
- Collection<IEntity> appearanceResource;\r
- if ((appearanceResource = instance.getRelatedObjects(Resources.g3dResource.HasAppearance)) != null && appearanceResource.size() > 0) {\r
- return AppearanceTools.getAppearance(new Appearance(instance.getGraph(),appearanceResource.iterator().next().getResource()), renderer);\r
- }\r
- throw new RuntimeException("Given instance does not have Appearance definition!");\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import java.util.Collection;\r
-\r
-import org.eclipse.jface.action.IMenuManager;\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.simantics.db.Graph;\r
-import org.simantics.proconf.g3d.actions.ContextAction;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-\r
-public interface EditorContribution {\r
- \r
- public String getName();\r
- \r
- /**\r
- * Initializes the contribution\r
- * @param graph\r
- */\r
- void initialize(Graph graph);\r
- \r
- \r
- /**\r
- * Allows contribution to modify current ui.\r
- * @param parent\r
- */\r
- void createControl(Composite parent);\r
- \r
- /**\r
- * Removes all changes created by createControl\r
- */\r
- void disposeControl();\r
- \r
- /**\r
- * Fills context menu\r
- * @param graph\r
- * @param manager\r
- */\r
- void fillContextMenu(Graph graph, IMenuManager manager, StructuredResourceSelection selection);\r
- \r
- /**\r
- * Fills toolbar\r
- * \r
- * @param manager\r
- */\r
- void fillLocalToolBar(IToolBarManager manager);\r
- \r
- /**\r
- * Fills menumanager\r
- * \r
- * \r
- * @param manager\r
- */\r
- void fillLocalPullDown(IMenuManager manager);\r
-\r
- \r
- /**\r
- * Returns context dependent actions\r
- * @return\r
- */\r
- Collection<ContextAction> getActions();\r
- \r
- /**\r
- * \r
- */\r
- void run();\r
- \r
- void dispose();\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import org.eclipse.ui.IPartListener;\r
-import org.eclipse.ui.IWorkbenchPart;\r
-\r
-/**\r
- * IPartListener that allows editor to load its content after the editorPart is activated.\r
- * \r
- * This is crucial with 3D graphics, which does not work if the editor part is activated\r
- * after the data has been loaded.\r
- * \r
- * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
- *\r
- */\r
-public abstract class EditorLoader implements IPartListener {\r
-\r
- boolean opened = false;\r
- boolean activated = false;\r
- \r
- public void partOpened(IWorkbenchPart part) {\r
- if (part.equals(getWorkbechPart())) {\r
- opened = true;\r
- }\r
- }\r
- \r
- public void partActivated(IWorkbenchPart part) {\r
- if (part.equals(getWorkbechPart())) {\r
- if (opened & !activated) {\r
- activated = true;\r
- load();\r
- }\r
- }\r
- }\r
- \r
- public void partBroughtToTop(IWorkbenchPart part) {}\r
- \r
- public void partClosed(IWorkbenchPart part) {}\r
- \r
- public void partDeactivated(IWorkbenchPart part) {}\r
- \r
- /**\r
- * Returns the IWorkbenchPart of the editor\r
- * @return\r
- */\r
- public abstract IWorkbenchPart getWorkbechPart();\r
- \r
- /**\r
- * Starts the content loading process\r
- */\r
- public abstract void load();\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.Tuple3d;\r
-\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.proconf.g3d.Resources;\r
-\r
-/**\r
- * Set of methods that make scene-graph handling easier.\r
- * \r
- * \r
- * @author Marko Luukkainen <Marko.Luukkainen@vtt.fi>\r
- *\r
- */\r
-public class G3DAPI {\r
-\r
- \r
- public static void setWorldPosition(IEntity node, Tuple3d position) {\r
- G3DTools.setTuple3(node.getSingleRelatedObject(Resources.g3dResource.HasWorldPosition), position);\r
- //G3DTools.transformationUpdate(node.getGraph(), node.getResource());\r
- G3DTools.propagateWorldTransformChange(node.getSingleRelatedObject(Resources.g3dResource.HasParent), node);\r
- }\r
- \r
- public static void setLocalPosition(IEntity node, Tuple3d position) {\r
- G3DTools.setTuple3(node.getSingleRelatedObject(Resources.g3dResource.HasLocalPosition), position);\r
- //G3DTools.transformationUpdate(node.getGraph(), node.getResource());\r
- G3DTools.propagateLocalTransformChange(node.getSingleRelatedObject(Resources.g3dResource.HasParent), node);\r
- \r
- }\r
- \r
- public static void setWorldOrientation(IEntity node, AxisAngle4d orientation) {\r
- G3DTools.setOrientation(node.getSingleRelatedObject(Resources.g3dResource.HasWorldOrientation), orientation);\r
- //G3DTools.transformationUpdate(node.getGraph(), node.getResource());\r
- G3DTools.propagateWorldTransformChange(node.getSingleRelatedObject(Resources.g3dResource.HasParent), node);\r
- \r
- }\r
- \r
- public static void setLocalOrientation(IEntity node, AxisAngle4d orientation) {\r
- G3DTools.setOrientation(node.getSingleRelatedObject(Resources.g3dResource.HasLocalOrientation), orientation);\r
- //G3DTools.transformationUpdate(node.getGraph(), node.getResource());\r
- G3DTools.propagateLocalTransformChange(node.getSingleRelatedObject(Resources.g3dResource.HasParent), node);\r
- \r
- \r
- }\r
- \r
- public static void setWorldTransformation(IEntity node, Tuple3d position, AxisAngle4d orientation) {\r
- G3DTools.setTuple3(node.getSingleRelatedObject(Resources.g3dResource.HasWorldPosition), position);\r
- G3DTools.setOrientation(node.getSingleRelatedObject(Resources.g3dResource.HasWorldOrientation), orientation);\r
- //G3DTools.transformationUpdate(node.getGraph(), node.getResource());\r
- G3DTools.propagateWorldTransformChange(node.getSingleRelatedObject(Resources.g3dResource.HasParent), node);\r
- \r
- }\r
- \r
- public static void setLocalTransformation(IEntity node, Tuple3d position, AxisAngle4d orientation) {\r
- G3DTools.setTuple3(node.getSingleRelatedObject(Resources.g3dResource.HasLocalPosition), position);\r
- G3DTools.setOrientation(node.getSingleRelatedObject(Resources.g3dResource.HasLocalOrientation), orientation);\r
- //G3DTools.transformationUpdate(node.getGraph(), node.getResource());\r
- G3DTools.propagateLocalTransformChange(node.getSingleRelatedObject(Resources.g3dResource.HasParent), node);\r
- }\r
- \r
- public static void addNodeWorld(IEntity parent, IEntity node) {\r
- parent.addStatement(Resources.g3dResource.HasChild, node);\r
- G3DTools.propagateWorldTransformChange(parent,node);\r
- }\r
- \r
- public static void addNodeLocal(IEntity parent, IEntity node) {\r
- parent.addStatement(Resources.g3dResource.HasChild, node);\r
- G3DTools.propagateLocalTransformChange(parent,node);\r
- }\r
- \r
- public static void addNodeWorld(IEntity parent, Resource relation, IEntity node) {\r
- assert(parent.getGraph().isSubrelationOf(relation, Resources.g3dResource.HasChild));\r
- parent.addStatement(relation, node);\r
- G3DTools.propagateWorldTransformChange(parent,node);\r
- }\r
- \r
- public static void addNodeLocal(IEntity parent, Resource relation, IEntity node) {\r
- assert(parent.getGraph().isSubrelationOf(relation, Resources.g3dResource.HasChild));\r
- parent.addStatement(relation, node);\r
- G3DTools.propagateLocalTransformChange(parent,node);\r
- }\r
- \r
- public static void removeNode(IEntity node) {\r
- node.removeRelatedStatements(Resources.g3dResource.HasParent);\r
- }\r
- \r
- public static void moveNode(IEntity node, IEntity newParent) {\r
- node.removeRelatedStatements(Resources.g3dResource.HasParent);\r
- newParent.addStatement(Resources.g3dResource.HasChild, node);\r
- G3DTools.propagateWorldTransformChange(newParent,node);\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import java.util.Collection;\r
-import java.util.Set;\r
-import java.util.Stack;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.AxisAngle4f;\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Point3f;\r
-import javax.vecmath.Quat4d;\r
-import javax.vecmath.Tuple3d;\r
-import javax.vecmath.Tuple3f;\r
-import javax.vecmath.Vector3d;\r
-import javax.vecmath.Vector3f;\r
-\r
-import org.simantics.db.Builtins;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.Statement;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.viewpoints.State;\r
-import org.simantics.layer0.utils.viewpoints.TraversalDecision;\r
-import org.simantics.layer0.utils.viewpoints.TraversalResult;\r
-import org.simantics.layer0.utils.viewpoints.TraversalRule;\r
-import org.simantics.layer0.utils.viewpoints.TraversalUtils;\r
-import org.simantics.proconf.g3d.Resources;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-import org.simantics.proconf.g3d.stubs.Orientation;\r
-import org.simantics.proconf.g3d.stubs.Position;\r
-\r
-/**\r
- * Basic ThreeDimensionalModelingOntology tools\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public class G3DTools {\r
- \r
- private static boolean DEBUG = false;\r
- \r
- private static TransformationTools tt;\r
-\r
- public static void initialize() {\r
- tt = new TransformationTools(Resources.g3dResource.HasChild, Resources.g3dResource.HasParent);\r
- }\r
- \r
- public static void deinitialize() {\r
- tt = null;\r
- }\r
- \r
- public static Point3d getPoint(IEntity p) {\r
- return new Point3d(p.getSingleRelatedScalarDouble(Resources.g3dResource.HasX),\r
- p.getSingleRelatedScalarDouble(Resources.g3dResource.HasY),\r
- p.getSingleRelatedScalarDouble(Resources.g3dResource.HasZ));\r
- }\r
- \r
- public static Point3f getPointFloat(IEntity p) {\r
- return new Point3f((float)p.getSingleRelatedScalarDouble(Resources.g3dResource.HasX),\r
- (float)p.getSingleRelatedScalarDouble(Resources.g3dResource.HasY),\r
- (float)p.getSingleRelatedScalarDouble(Resources.g3dResource.HasZ));\r
- }\r
- \r
- \r
- public static Vector3d getVector(IEntity p) {\r
- return new Vector3d(p.getSingleRelatedScalarDouble(Resources.g3dResource.HasX),\r
- p.getSingleRelatedScalarDouble(Resources.g3dResource.HasY),\r
- p.getSingleRelatedScalarDouble(Resources.g3dResource.HasZ));\r
- }\r
- \r
- public static Vector3f getVectorFloat(IEntity p) {\r
- return new Vector3f((float)p.getSingleRelatedScalarDouble(Resources.g3dResource.HasX),\r
- (float)p.getSingleRelatedScalarDouble(Resources.g3dResource.HasY),\r
- (float)p.getSingleRelatedScalarDouble(Resources.g3dResource.HasZ));\r
- }\r
-\r
- \r
- public static void setTuple3(IEntity d, Tuple3d translation) {\r
- d.setRelatedScalarDouble(Resources.g3dResource.HasX, translation.x);\r
- d.setRelatedScalarDouble(Resources.g3dResource.HasY, translation.y);\r
- d.setRelatedScalarDouble(Resources.g3dResource.HasZ, translation.z); \r
- }\r
- \r
- public static void setTuple3(IEntity d, Tuple3f translation) {\r
- d.setRelatedScalarDouble(Resources.g3dResource.HasX, translation.x);\r
- d.setRelatedScalarDouble(Resources.g3dResource.HasY, translation.y);\r
- d.setRelatedScalarDouble(Resources.g3dResource.HasZ, translation.z); \r
- }\r
-\r
- public static void setTuple3(IEntity d, double x, double y, double z) {\r
- d.setRelatedScalarDouble(Resources.g3dResource.HasX, x);\r
- d.setRelatedScalarDouble(Resources.g3dResource.HasY, y);\r
- d.setRelatedScalarDouble(Resources.g3dResource.HasZ, z); \r
- }\r
- \r
- public static void addTuple3(IEntity d, Tuple3d translation) {\r
- d.setRelatedScalarDouble(Resources.g3dResource.HasX, translation.x + d.getSingleRelatedScalarDouble(Resources.g3dResource.HasX));\r
- d.setRelatedScalarDouble(Resources.g3dResource.HasY, translation.y + d.getSingleRelatedScalarDouble(Resources.g3dResource.HasY));\r
- d.setRelatedScalarDouble(Resources.g3dResource.HasZ, translation.z + d.getSingleRelatedScalarDouble(Resources.g3dResource.HasZ));\r
- }\r
- \r
- public static void addTuple3(IEntity d, Tuple3f translation) {\r
- d.setRelatedScalarDouble(Resources.g3dResource.HasX, translation.x + d.getSingleRelatedScalarDouble(Resources.g3dResource.HasX));\r
- d.setRelatedScalarDouble(Resources.g3dResource.HasY, translation.y + d.getSingleRelatedScalarDouble(Resources.g3dResource.HasY));\r
- d.setRelatedScalarDouble(Resources.g3dResource.HasZ, translation.z + d.getSingleRelatedScalarDouble(Resources.g3dResource.HasZ));\r
- }\r
-\r
- public static void addTuple3(IEntity d, double x, double y, double z) {\r
- d.setRelatedScalarDouble(Resources.g3dResource.HasX, x + d.getSingleRelatedScalarDouble(Resources.g3dResource.HasX));\r
- d.setRelatedScalarDouble(Resources.g3dResource.HasY, y + d.getSingleRelatedScalarDouble(Resources.g3dResource.HasY));\r
- d.setRelatedScalarDouble(Resources.g3dResource.HasZ, z + d.getSingleRelatedScalarDouble(Resources.g3dResource.HasZ)); \r
- }\r
- \r
- public static AxisAngle4d getOrientation(IEntity r) {\r
- return new AxisAngle4d(r.getSingleRelatedScalarDouble(Resources.g3dResource.HasX),\r
- r.getSingleRelatedScalarDouble(Resources.g3dResource.HasY),\r
- r.getSingleRelatedScalarDouble(Resources.g3dResource.HasZ),\r
- r.getSingleRelatedScalarDouble(Resources.g3dResource.HasAngle));\r
- }\r
- \r
- public static AxisAngle4f getOrientationFloat(IEntity r) {\r
- return new AxisAngle4f((float)r.getSingleRelatedScalarDouble(Resources.g3dResource.HasX),\r
- (float)r.getSingleRelatedScalarDouble(Resources.g3dResource.HasY),\r
- (float)r.getSingleRelatedScalarDouble(Resources.g3dResource.HasZ),\r
- (float)r.getSingleRelatedScalarDouble(Resources.g3dResource.HasAngle));\r
- }\r
-\r
- public static void setOrientation(IEntity r, AxisAngle4d aa) {\r
- r.setRelatedScalarDouble(Resources.g3dResource.HasX, aa.x);\r
- r.setRelatedScalarDouble(Resources.g3dResource.HasY, aa.y);\r
- r.setRelatedScalarDouble(Resources.g3dResource.HasZ, aa.z);\r
- r.setRelatedScalarDouble(Resources.g3dResource.HasAngle, aa.angle);\r
- }\r
- \r
- \r
- public static void multiplyOrientation(IEntity r, AxisAngle4d rot) {\r
- AxisAngle4d current = getOrientation(r);\r
- Quat4d q1 = new Quat4d();\r
- q1.set(current);\r
- Quat4d q2 = new Quat4d();\r
- // q2.set(rot);\r
- q2.set(rot);\r
- q2.mul(q1);\r
- rot.set(q2);\r
- setOrientation(r, rot);\r
- }\r
- \r
- \r
- public static AxisAngle4d getWorldFromLocal(IEntity node, AxisAngle4d localRot) {\r
- return tt.getWorldFromLocal(node, localRot);\r
- }\r
- \r
- public static Point3d getWorldFromLocal(IEntity node, Point3d localRot) {\r
- return tt.getWorldFromLocal(node, localRot);\r
- }\r
- \r
- public static AxisAngle4d getLocalFromWorld(IEntity node, AxisAngle4d localRot) {\r
- return tt.getLocalFromWorld(node, localRot);\r
- }\r
- \r
- public static Point3d getLocalFromWorld(IEntity node, Point3d localRot) {\r
- return tt.getLocalFromWorld(node, localRot);\r
- }\r
- \r
- public static void propagateLocalTransformChange(IEntity node, IEntity child) {\r
- tt.propagateLocalTransformChange(node, child);\r
- }\r
- \r
- public static void propagateWorldTransformChange(IEntity node, IEntity child) {\r
- tt.propagateWorldTransformChange(node, child);\r
- }\r
- \r
- public static void transformationUpdate(Graph graph, Resource resource) {\r
- tt.transformationUpdate(graph, resource);\r
- }\r
- \r
- public static void resetTransformation(IEntity shape) {\r
- Graph graph = shape.getGraph();\r
- if (shape.getAtMostOneRelatedObject(Resources.g3dResource.HasLocalPosition) == null) {\r
-\r
- // LocalPosition p = LocalPosition.createDefault(graph);\r
- Position p = Position.createDefault(graph);\r
- shape.addStatement(Resources.g3dResource.HasLocalPosition, p);\r
- // WorldPosition p2 = WorldPosition.createDefault(graph);\r
- Position p2 = Position.createDefault(graph);\r
- shape.addStatement(Resources.g3dResource.HasWorldPosition, p2);\r
- p.setX(new double[] { 0.0 });\r
- p.setY(new double[] { 0.0 });\r
- p.setZ(new double[] { 0.0 });\r
-\r
- p2.setX(new double[] { 0.0 });\r
- p2.setY(new double[] { 0.0 });\r
- p2.setZ(new double[] { 0.0 });\r
-\r
- } else {\r
- G3DTools.setTuple3(shape.getSingleRelatedObject(Resources.g3dResource.HasLocalPosition), 0.0, 0.0, 0.0);\r
- G3DTools.setTuple3(shape.getSingleRelatedObject(Resources.g3dResource.HasWorldPosition), 0.0, 0.0, 0.0);\r
- }\r
- if (shape.getAtMostOneRelatedObject(Resources.g3dResource.HasLocalOrientation) == null) {\r
-\r
- // LocalOrientation r = LocalOrientationFactory.create(graph);\r
- Orientation r = Orientation.createDefault(graph);\r
- shape.addStatement(Resources.g3dResource.HasLocalOrientation, r);\r
- // WorldOrientation r2 = WorldOrientationFactory.create(graph);\r
- Orientation r2 = Orientation.createDefault(graph);\r
- shape.addStatement(Resources.g3dResource.HasWorldOrientation, r2);\r
- r.setAngle(new double[] { 0.0 });\r
- r.setX(new double[] { 1.0 });\r
- r.setY(new double[] { 0.0 });\r
- r.setZ(new double[] { 0.0 });\r
- r2.setAngle(new double[] { 0.0 });\r
- r2.setX(new double[] { 1.0 });\r
- r2.setY(new double[] { 0.0 });\r
- r2.setZ(new double[] { 0.0 });\r
-\r
- } else {\r
- G3DTools.setOrientation(shape.getSingleRelatedObject(Resources.g3dResource.HasLocalOrientation),\r
- new AxisAngle4d(0.0, 1.0, 0.0, 0.0));\r
- G3DTools.setOrientation(shape.getSingleRelatedObject(Resources.g3dResource.HasWorldOrientation),\r
- new AxisAngle4d(0.0, 1.0, 0.0, 0.0));\r
- }\r
- }\r
- \r
- \r
- public static G3DNode getModelFromResource(Graph graph,Resource resource) {\r
- G3DNode node = new G3DNode(graph, resource);\r
- while (true) {\r
- G3DNode parent = node.getParent();\r
- if (parent == null)\r
- break;\r
- node = parent;\r
- }\r
- return node;\r
- }\r
- \r
- /**\r
- * Checks if instance has a certain property instance\r
- * @param instance\r
- * @param propertyInstance\r
- * @return\r
- */\r
- public static boolean hasProperty(Graph graph,Resource instance, Resource propertyInstance) {\r
- Builtins builtins = graph.getBuiltins();\r
- Stack<IEntity> props = new Stack<IEntity>();\r
- IEntity IEntity = EntityFactory.create(graph, instance);\r
- Collection<IEntity> res = IEntity.getRelatedObjects(builtins.HasProperty);\r
- for (IEntity t : res)\r
- props.add(t);\r
- \r
- while (!props.isEmpty()) {\r
- IEntity property = props.pop();\r
- if (property.getResource().equals(propertyInstance)) {\r
- return true;\r
- }\r
- res = property.getRelatedObjects(builtins.HasProperty);\r
- for (IEntity r : res) {\r
- props.add(r);\r
- }\r
- }\r
- return false;\r
- }\r
- \r
- /**\r
- * Checks if one of shapes subshapes has a certain property\r
- * @param instance shape instance\r
- * @param propertyInstance instance of a property\r
- * @return\r
- * \r
- */\r
- public static boolean hasSubProperty(Graph graph,Resource instance, Resource propertyInstance) {\r
- Builtins builtins = graph.getBuiltins();\r
- Stack<IEntity> instances = new Stack<IEntity>();\r
-\r
- //Resource res[] = instance.getRelatedResources(Builtins.HasProperty);\r
- IEntity entity = EntityFactory.create(graph, instance);\r
- Collection<IEntity> res;\r
-// res = entity.getRelatedObjects(Resources.g3dResource.HasChild);\r
-// for (IEntity t : res) {\r
-// Collection<IEntity> sub = t.getRelatedObjects(Resources.g3dResource.HasGeometryDefinition);\r
-// if (sub.size() > 0)\r
-// instances.addAll(sub);\r
-// }\r
- {\r
- Collection<IEntity> sub = entity.getRelatedObjects(Resources.g3dResource.HasGeometryDefinition);\r
- if (sub.size() > 0)\r
- instances.addAll(sub);\r
- }\r
- while (!instances.isEmpty()) {\r
- IEntity i = instances.pop();\r
- Stack<IEntity> props = new Stack<IEntity>();\r
- res = i.getRelatedObjects(builtins.HasProperty);\r
- for (IEntity r : res) {\r
- props.add(r);\r
- }\r
- while (!props.isEmpty()) {\r
- IEntity property = props.pop();\r
- if (property.equals(propertyInstance)) {\r
- return true;\r
- }\r
- res = property.getRelatedObjects(builtins.HasProperty);\r
- for (IEntity r : res) {\r
- props.add(r);\r
- }\r
- }\r
- res = i.getRelatedObjects(Resources.g3dResource.HasGeometryDefinition);\r
- for (IEntity r : res) {\r
- // TODO : unnecessary check\r
- Collection<IEntity> sub = r.getRelatedObjects(Resources.g3dResource.GeometryDefinitionOf);\r
- if (sub.size() > 0)\r
- instances.add(r);\r
- }\r
- \r
- }\r
- return false;\r
- }\r
- \r
- \r
- \r
- \r
- \r
- \r
- /**\r
- * Loads positions of control point to rule cache\r
- * \r
- * @param root resource of the modeled plant\r
- */\r
- public static void reloadCache(Graph graph, Resource root) {\r
-// TraverseHandler handler = new TraverseHandler() {\r
-// public boolean addToResult(Resource r) {\r
-// if (r.isInstanceOf(GlobalIdMap.get(ThreeDimensionalModelingOntologyMapping.GRAPHICS_NODE)))\r
-// return true;\r
-// return false;\r
-// }\r
-// \r
-// public TraverseRelation[] traverseFromResource(Resource resource) {\r
-// return new TraverseRelation[] { new TraverseRelation(\r
-// ThreeDimensionalModelingOntologyMapping.HAS_SUBNODES,\r
-// TraverseDirection.OUTBOUND)};\r
-// }\r
-// \r
-// \r
-// };\r
- \r
- IEntity IEntity = EntityFactory.create(graph, root);\r
- State s = new State() {};\r
- TraversalResult res = TraversalUtils.traverse(new TraversalRule (){\r
- \r
- \r
- @Override\r
- public boolean areAllStatesRelevant() {\r
- return true;\r
- }\r
- \r
- @Override\r
- public TraversalDecision makeTraversalDecision(State state,\r
- Statement statement) {\r
- if (statement.getPredicate().isInstanceOf(Resources.g3dResource.HasChild))\r
- return TraversalDecision.continueTraversal(state);\r
- else\r
- return TraversalDecision.stopTraversal;\r
- }\r
- \r
- @Override\r
- public Collection<State> relevantStates() {\r
- return null;\r
- }\r
- }, IEntity,s\r
- );\r
- \r
- \r
- Set<Resource> cps = res.get(s);\r
- \r
- //Collection<Resource> cps = TraverseUtils.traverseGraph(root, handler);\r
- for (Resource r : cps) {\r
- G3DNode cp = new G3DNode(graph,r);\r
- if (cp.getLocalPosition() != null)\r
- tt.storeProperty(cp.getLocalPosition().getResource(),G3DTools.getPoint(cp.getLocalPosition()));\r
- if (cp.getWorldPosition() != null)\r
- tt.storeProperty(cp.getWorldPosition().getResource(),G3DTools.getPoint(cp.getWorldPosition()));\r
- if (cp.getLocalOrientation() != null)\r
- tt.storeProperty(cp.getLocalOrientation().getResource(),G3DTools.getOrientation(cp.getLocalOrientation()));\r
- if (cp.getWorldOrientation() != null)\r
- tt.storeProperty(cp.getWorldOrientation().getResource(),G3DTools.getOrientation(cp.getWorldOrientation()));\r
- \r
- }\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import org.simantics.layer0.utils.IEntity;\r
-\r
-\r
-/**\r
- * Interface for geometryProviders\r
- * \r
- * TODO : instead of using Geometry array, create class that is passed through\r
- * TODO : Current animation system links resources; what about code generated meshes ?\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public interface GeometryProvider {\r
- \r
- /**\r
- * Used to check if GeometryProvider can generate mesh\r
- * @param instance\r
- * @return\r
- */\r
- public boolean canHandle(IEntity instance);\r
- \r
- /**\r
- * Generates mesh\r
- * @param instance\r
- * @param transform\r
- * @return\r
- */\r
- public com.jme.scene.Geometry[] getGeometryFromResource(IEntity instance, boolean transform);\r
- \r
- /**\r
- * Updates mesh\r
- * @param instance\r
- * @param transform\r
- * @param geometry\r
- * @return\r
- */\r
- public boolean reconstructGeometry(IEntity instance, boolean transform, com.jme.scene.Geometry[] geometry);\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.Collections;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import org.eclipse.core.runtime.CoreException;\r
-import org.eclipse.core.runtime.IConfigurationElement;\r
-import org.eclipse.core.runtime.IExtension;\r
-import org.eclipse.core.runtime.IExtensionPoint;\r
-import org.eclipse.core.runtime.Platform;\r
-import org.eclipse.core.runtime.dynamichelpers.ExtensionTracker;\r
-import org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler;\r
-import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker;\r
-import org.eclipse.core.runtime.dynamichelpers.IFilter;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-import com.jme.scene.Geometry;\r
-\r
-public class GeometryProviderRegistry implements IExtensionChangeHandler {\r
- private static GeometryProviderRegistry instance;\r
- public final static String ELEMENT_NAME = "Geometry";\r
- public final static String NAMESPACE = "org.simantics.proconf.g3d";\r
- public final static String EP_NAME = "geometry";\r
- \r
- private ExtensionTracker tracker;\r
- \r
- private List<GeometryProviderExtension> extensions = new ArrayList<GeometryProviderExtension>();\r
- private Map<Resource,GeometryProvider> providers;\r
- \r
- private GeometryProviderRegistry() {\r
- providers = new HashMap<Resource,GeometryProvider>();\r
- \r
- tracker = new ExtensionTracker();\r
- \r
- IExtensionPoint ep = Platform.getExtensionRegistry().getExtensionPoint(NAMESPACE,EP_NAME);\r
- loadExtensions(ep.getConfigurationElements());\r
- \r
- IFilter filter = ExtensionTracker.createExtensionPointFilter(ep);\r
- tracker.registerHandler(this, filter);\r
- }\r
- \r
- private void close() {\r
- tracker.close();\r
- tracker = null;\r
- extensions = new ArrayList<GeometryProviderExtension>();\r
- }\r
- \r
- public static synchronized GeometryProviderRegistry getInstance() {\r
- if (instance==null) instance = new GeometryProviderRegistry();\r
- return instance;\r
- }\r
- \r
- public static synchronized void dispose() {\r
- if (instance != null) {\r
- instance.close();\r
- instance = null;\r
- } \r
- }\r
- \r
- public synchronized List<GeometryProviderExtension> getExtensions() {\r
- return Collections.unmodifiableList(extensions);\r
- }\r
- \r
- private synchronized void loadExtensions(IConfigurationElement[] elements) {\r
- for (IConfigurationElement el : elements) {\r
- String id = el.getAttribute("id");\r
- try {\r
- Object o = el.createExecutableExtension("class");\r
- GeometryProviderExtension ext = new GeometryProviderExtension(id,(GeometryProvider)o);\r
- tracker.registerObject(el.getDeclaringExtension(), ext, IExtensionTracker.REF_STRONG);\r
- extensions.add(ext);\r
- } catch (CoreException e) {\r
- ErrorLogger.defaultLogError("Cannot create java interface for GeometryProvider " + id, e);\r
- }\r
- }\r
- }\r
- \r
- private Map<Resource,GeometryProvider> getProviderMap() {\r
- return providers;\r
- }\r
- \r
- public static Geometry[] getGeometry(IEntity thing, boolean transform) {\r
- GeometryProvider provider = getGeometryProvider(thing);\r
- return provider.getGeometryFromResource(thing, transform);\r
- }\r
- \r
- public static GeometryProvider getGeometryProvider(IEntity thing) {\r
- Collection<IEntity> types = thing.getRelatedObjects(thing.getGraph().getBuiltins().InstanceOf);\r
- \r
- //Resource types[] = OntologyUtils.getTypes(resource);\r
- for (IEntity t : types) {\r
- GeometryProvider provider = getInstance().getProviderMap().get(t.getResource());\r
- if (provider == null) {\r
- //for (Extension<GeometryProvider> e : getInstance().getExtensions()) {\r
- for (GeometryProviderExtension e : getInstance().getExtensions()) {\r
- if (e.provider.canHandle(thing)) {\r
- getInstance().getProviderMap().put(t.getResource(), e.provider);\r
- return e.provider;\r
- }\r
- }\r
- \r
- } else {\r
- return provider;\r
- }\r
- }\r
- \r
- throw new UnsupportedOperationException("Cannot handle resource " + thing);\r
- }\r
- \r
- @Override\r
- public void addExtension(IExtensionTracker tracker, IExtension extension) {\r
- loadExtensions(extension.getConfigurationElements());\r
- }\r
- \r
- @Override\r
- public synchronized void removeExtension(IExtension extension, Object[] objects) {\r
- for (Object o : objects) {\r
- GeometryProviderExtension ext = (GeometryProviderExtension) o;\r
- tracker.unregisterObject(extension, ext);\r
- extensions.remove(ext);\r
- }\r
- }\r
- \r
- public class GeometryProviderExtension {\r
- public String id;\r
- public GeometryProvider provider;\r
- \r
- public GeometryProviderExtension(String id, GeometryProvider provider) {\r
- this.id = id;\r
- this.provider = provider;\r
- }\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import com.jme.renderer.Camera;\r
-import com.jme.scene.Node;\r
-import com.jme.system.DisplaySystem;\r
-\r
-\r
-\r
-\r
-/**\r
- * Rendering component\r
- * Allows to change underlying rendering so that\r
- * additional information can be presented to the user\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public abstract class JmeRenderingComponent {\r
- public static final int PARALLEL_PROJECTION = 0;\r
- public static final int PERSPECTIVE_PROJECTION = 1;\r
- \r
- /**\r
- * Returns root node for nodes that cast and receive shadows.\r
- * @return\r
- */\r
- public abstract Node getShadowRoot();\r
- \r
- /**\r
- * Returns root node for nodes that do not cast shadows.\r
- * @return\r
- */\r
- public abstract Node getNoCastRoot();\r
- \r
- /**\r
- * Returns root node of the scenegraph\r
- * @return\r
- */\r
- public abstract Node getRoot();\r
- \r
- /**\r
- * Returns root node of orthogonal nodes (nodes that always face the camera)\r
- * @return\r
- */\r
- public abstract Node getOrthoNode();\r
- \r
- /**\r
- * Returns root node for nodes that do not cast or receive shadows.\r
- * @return\r
- */\r
- public abstract Node getNoShadowRoot();\r
- \r
- public abstract void init(DisplaySystem displaySystem);\r
- \r
- /**\r
- * Sets projection policy.\r
- * FIXME : this was for Xith compatibility!\r
- * @param policy\r
- */\r
- public abstract void setProjectionPolicy(int policy);\r
- public abstract int getProjectionPolicy();\r
- \r
- public abstract float getScreenScale();\r
- public abstract void setScreenScale(float screenScale);\r
- public abstract float getFieldOfView();\r
- public abstract void dispose();\r
- \r
- /**\r
- * Update flag (Return true if view needs to be rendered)\r
- * @return\r
- */\r
- public boolean update() {return false;}\r
- public abstract Camera getCamera();\r
- \r
- public abstract void render();\r
- public abstract void resize(int width, int height);\r
- public abstract DisplaySystem getDisplaySystem();\r
- \r
- /**\r
- * TODO : this is for debugging purposes and will be removed.\r
- * @param text\r
- */\r
- public abstract void setDebugText(String text);\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.Matrix3d;\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Quat4d;\r
-import javax.vecmath.Tuple3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import com.jme.math.Vector2f;\r
-\r
-/**\r
- * Some useful geometry related math functions. Beware, methods may modify their input parameters!\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public class MathTools {\r
- \r
- static double EPS = 0.001;\r
- \r
- public static Vector3d closestPointOnEdge(Vector3d point, Vector3d edgePoint1, Vector3d edgePoint2) {\r
- point.sub(edgePoint1);\r
- Vector3d v = new Vector3d(edgePoint2);\r
- v.sub(edgePoint1);\r
- double t = v.dot(point);\r
- t /= v.lengthSquared();\r
- if (t <= 0.0f)\r
- return edgePoint1;\r
- if (t >= 1.0f)\r
- return edgePoint2;\r
- v.scale(t);\r
- v.add(edgePoint1);\r
- return v; \r
- }\r
- \r
- public static Vector3d closestPointOnStraight(Point3d point, Point3d straightPoint, Vector3d straightDir) {\r
- Vector3d v = new Vector3d(point);\r
- v.sub(straightPoint);\r
- double t = straightDir.dot(v);\r
- t /= straightDir.lengthSquared();\r
- v.set(straightDir);\r
- v.scale(t);\r
- v.add(straightPoint);\r
- return v; \r
- }\r
- \r
- public static Vector3d closestPointOnStraight(Point3d point, Point3d straightPoint, Vector3d straightDir, double u[]) {\r
- Vector3d v = new Vector3d(point);\r
- v.sub(straightPoint);\r
- u[0] = straightDir.dot(v);\r
- u[0] /= straightDir.lengthSquared();\r
- v.set(straightDir);\r
- v.scale(u[0]);\r
- v.add(straightPoint);\r
- return v; \r
- }\r
- \r
- public static double distanceFromPlane(Vector3d point, Vector3d planeNormal, Tuple3d planePoint) {\r
- point.sub(planePoint);\r
- \r
- return planeNormal.dot(point);\r
- }\r
- \r
- public static double distanceFromPlane(Vector3d point, Vector3d planeNormal, float d) {\r
- return (planeNormal.dot(point) + d);\r
- }\r
- \r
- public static boolean intersectStraightPlane(Tuple3d linePoint, Vector3d lineDir, Tuple3d planePoint, Vector3d planeNormal, Tuple3d intersectPoint) {\r
- intersectPoint.set(planePoint);\r
- intersectPoint.sub(linePoint);\r
- double u = planeNormal.dot(new Vector3d(intersectPoint));\r
- double v = planeNormal.dot(lineDir);\r
- if (Math.abs(v) < EPS)\r
- return false;\r
- u /= v;\r
- intersectPoint.set(lineDir);\r
- intersectPoint.scale(u);\r
- intersectPoint.add(linePoint);\r
- return true;\r
- }\r
- \r
- public static boolean intersectStraightPlane(Tuple3d linePoint, Vector3d lineDir, Tuple3d planePoint, Vector3d planeNormal, Vector3d intersectPoint, double[] u) {\r
- intersectPoint.set(planePoint);\r
- intersectPoint.sub(linePoint);\r
- u[0] = planeNormal.dot(intersectPoint);\r
- double v = planeNormal.dot(lineDir);\r
- if (Math.abs(v) < EPS)\r
- return false;\r
- u[0] /= v;\r
- intersectPoint.set(lineDir);\r
- intersectPoint.scale(u[0]);\r
- intersectPoint.add(linePoint);\r
- return true;\r
- }\r
- \r
- public static boolean intersectLineLine(Vector3d p1,Vector3d p2,Vector3d p3,Vector3d p4,Vector3d pa,Vector3d pb) {\r
- Vector3d p13 = new Vector3d();\r
- Vector3d p43 = new Vector3d();\r
- Vector3d p21 = new Vector3d();\r
- double d1343,d4321,d1321,d4343,d2121;\r
- double numer,denom;\r
- p13.sub(p1, p3);\r
- p43.sub(p4,p3);\r
- if (Math.abs(p43.x) < EPS && Math.abs(p43.y) < EPS && Math.abs(p43.z) < EPS)\r
- return false;\r
- p21.sub(p2,p1);\r
- if (Math.abs(p21.x) < EPS && Math.abs(p21.y) < EPS && Math.abs(p21.z) < EPS)\r
- return false;\r
-\r
- d1343 = p13.dot(p43);\r
- d4321 = p43.dot(p21);\r
- d1321 = p13.dot(p21);\r
- d4343 = p43.lengthSquared();\r
- d2121 = p21.lengthSquared();\r
-\r
- denom = d2121 * d4343 - d4321 * d4321;\r
- if (Math.abs(denom) < EPS)\r
- return false;\r
- numer = d1343 * d4321 - d1321 * d4343;\r
-\r
- double mua = numer / denom;\r
- double mub = (d1343 + d4321 * mua) / d4343;\r
- \r
- pa.x = p1.x + mua * p21.x;\r
- pa.y = p1.y + mua * p21.y;\r
- pa.z = p1.z + mua * p21.z;\r
- pb.x = p3.x + mub * p43.x;\r
- pb.y = p3.y + mub * p43.y;\r
- pb.z = p3.z + mub * p43.z;\r
-\r
- return true;\r
- }\r
- \r
- public static boolean intersectStraightStraight(Vector3d p1,Vector3d p21,Vector3d p3,Vector3d p43,Tuple3d pa,Tuple3d pb) {\r
- Vector3d p13 = new Vector3d();\r
-\r
- double d1343,d4321,d1321,d4343,d2121;\r
- double numer,denom;\r
- \r
- p13.sub(p1, p3);\r
- if (Math.abs(p43.x) < EPS && Math.abs(p43.y) < EPS && Math.abs(p43.z) < EPS)\r
- return false;\r
- if (Math.abs(p21.x) < EPS && Math.abs(p21.y) < EPS && Math.abs(p21.z) < EPS)\r
- return false;\r
-\r
- d1343 = p13.dot(p43);\r
- d4321 = p43.dot(p21);\r
- d1321 = p13.dot(p21);\r
- d4343 = p43.lengthSquared();\r
- d2121 = p21.lengthSquared();\r
-\r
- denom = d2121 * d4343 - d4321 * d4321;\r
- if (Math.abs(denom) < EPS)\r
- return false;\r
- numer = d1343 * d4321 - d1321 * d4343;\r
-\r
- double mua = numer / denom;\r
- double mub = (d1343 + d4321 * mua) / d4343;\r
-\r
- pa.x = p1.x + mua * p21.x;\r
- pa.y = p1.y + mua * p21.y;\r
- pa.z = p1.z + mua * p21.z;\r
- pb.x = p3.x + mub * p43.x;\r
- pb.y = p3.y + mub * p43.y;\r
- pb.z = p3.z + mub * p43.z;\r
-\r
- return true;\r
- }\r
- \r
- /**\r
- * Calculate the line segment PaPb that is the shortest route between\r
- * two lines P1P2 and P3P4. Calculate also the values of mua and mub where\r
- * Pa = P1 + mua (P2 - P1)\r
- * Pb = P3 + mub (P4 - P3)\r
- * @param p1\r
- * @param p21\r
- * @param p3\r
- * @param p43\r
- * @param pa\r
- * @param pb\r
- * @param mu\r
- * @return\r
- */\r
- public static boolean intersectStraightStraight(Tuple3d p1,Vector3d p21,Tuple3d p3,Vector3d p43,Tuple3d pa,Tuple3d pb, double mu[]) {\r
- Vector3d p13 = new Vector3d();\r
-\r
- double d1343,d4321,d1321,d4343,d2121;\r
- double numer,denom;\r
- double EPS = 0.001;\r
- p13.sub(p1, p3);\r
- if (Math.abs(p43.x) < EPS && Math.abs(p43.y) < EPS && Math.abs(p43.z) < EPS)\r
- return false;\r
- if (Math.abs(p21.x) < EPS && Math.abs(p21.y) < EPS && Math.abs(p21.z) < EPS)\r
- return false;\r
-\r
- d1343 = p13.dot(p43);\r
- d4321 = p43.dot(p21);\r
- d1321 = p13.dot(p21);\r
- d4343 = p43.lengthSquared();\r
- d2121 = p21.lengthSquared();\r
-\r
- denom = d2121 * d4343 - d4321 * d4321;\r
- if (Math.abs(denom) < EPS)\r
- return false;\r
- numer = d1343 * d4321 - d1321 * d4343;\r
-\r
- mu[0] = numer / denom;\r
- mu[1] = (d1343 + d4321 * mu[0]) / d4343;\r
-\r
- pa.x = p1.x + mu[0] * p21.x;\r
- pa.y = p1.y + mu[0] * p21.y;\r
- pa.z = p1.z + mu[0] * p21.z;\r
- pb.x = p3.x + mu[1] * p43.x;\r
- pb.y = p3.y + mu[1] * p43.y;\r
- pb.z = p3.z + mu[1] * p43.z;\r
-\r
- return true;\r
- }\r
- \r
- public static AxisAngle4d getFromEuler2(Vector3d euler) {\r
- AxisAngle4d aa = new AxisAngle4d();\r
- aa.angle = euler.length();\r
- Vector3d normal = new Vector3d(euler);\r
- if (aa.angle > EPS) {\r
- normal.normalize();\r
- aa.x = normal.x;\r
- aa.y = normal.y;\r
- aa.z = normal.z;\r
- } else {\r
- aa.x = 1.0;\r
- aa.y = 0.0;\r
- aa.z = 0.0;\r
- }\r
- \r
- return aa;\r
- }\r
- \r
- public static Vector3d getEuler(AxisAngle4d aa) {\r
- Vector3d euler = new Vector3d(aa.x,aa.y,aa.z);\r
- euler.scale(aa.angle);\r
- return euler;\r
- }\r
- \r
- public static void rotate(Quat4d q, Tuple3d in, Tuple3d out) {\r
- // p' = q * p * q'\r
- double tw = - q.x*in.x - q.y*in.y - q.z*in.z;\r
- double tx = q.w*in.x + q.y*in.z - q.z*in.y;\r
- double ty = q.w*in.y - q.x*in.z + q.z*in.x;\r
- double tz = q.w*in.z + q.x*in.y - q.y*in.x ;\r
- \r
- //temp * q' -> x = -x, y = -y z = -z\r
- //out.w = tw*q.w + tx*q.x + ty*q.y + tz*q.z;\r
- out.x = -tw*q.x + tx*q.w - ty*q.z + tz*q.y;\r
- out.y = -tw*q.y + tx*q.z + ty*q.w - tz*q.x;\r
- out.z = -tw*q.z - tx*q.y + ty*q.x + tz*q.w; \r
- }\r
- \r
- public static void getMatrix(Quat4d quat, Matrix3d m) {\r
- m.m00 = 1.0f - 2.0 * (quat.y * quat.y + quat.z * quat.z);\r
- m.m01 = 2.0 * (quat.x * quat.y + quat.w * quat.z);\r
- m.m02 = 2.0 * (quat.x * quat.z - quat.w * quat.y);\r
- m.m10 = 2.0 * (quat.x * quat.y - quat.w * quat.z);\r
- m.m11 = 1.0 - 2.0f * (quat.x * quat.x + quat.z * quat.z);\r
- m.m12 = 2.0 * (quat.y * quat.z + quat.w * quat.x);\r
- m.m20 = 2.0 * (quat.x * quat.z + quat.w * quat.y);\r
- m.m21 = 2.0 * (quat.y * quat.z - quat.w * quat.x);\r
- m.m22 = 1.0 - 2.0f * (quat.x * quat.x + quat.y * quat.y);\r
-\r
- }\r
- \r
- public static void getQuat(Matrix3d mat, Quat4d quat) {\r
- double tr = mat.m00 + mat.m11 + mat.m22;\r
- if (tr > 0.0) {\r
- double s = Math.sqrt(tr + 1.0);\r
- quat.w = 0.5 * s;\r
- s = 0.5 / s;\r
- quat.x = (mat.m21 - mat.m12) * s;\r
- quat.y = (mat.m02 - mat.m20) * s;\r
- quat.z = (mat.m10 - mat.m01) * s;\r
- } else {\r
- int i = 0, j, k;\r
- if (mat.m11 > mat.m00)\r
- i = 1;\r
- if (mat.m22 > mat.getElement(i, i))\r
- i = 2;\r
- int nxt[] = { 1, 2, 0 };\r
-\r
- j = nxt[i];\r
- k = nxt[j];\r
-\r
- double s = Math\r
- .sqrt((mat.getElement(i, i) - (mat.getElement(j, j) + mat\r
- .getElement(k, k))) + 1.0);\r
-\r
- double q[] = new double[3];\r
- q[i] = s * 0.5;\r
-\r
- if (Math.abs(s) > 0.001)\r
- s = 0.5 / s;\r
-\r
- quat.w = (mat.getElement(k, j) - mat.getElement(j, k)) * s;\r
- q[j] = (mat.getElement(j, i) + mat.getElement(i, j)) * s;\r
- q[k] = (mat.getElement(k, i) + mat.getElement(i, k)) * s;\r
-\r
- quat.x = q[0];\r
- quat.y = q[1];\r
- quat.z = q[2];\r
- }\r
- }\r
- \r
- \r
- /*\r
- * Cohen-Sutherland\r
- */\r
- \r
- private static final int IN = 0;\r
- private static final int LEFT = 1;\r
- private static final int RIGHT = 2;\r
- private static final int BOTTOM = 4;\r
- private static final int TOP = 8;\r
- \r
- \r
- private static int bitcode(Vector2f p1, Vector2f min, Vector2f max) {\r
- int code = IN;\r
- if (p1.x < min.x)\r
- code |= LEFT;\r
- else if (p1.x > max.x)\r
- code |= RIGHT;\r
- if (p1.y < min.y)\r
- code |= BOTTOM;\r
- else if (p1.y > max.y)\r
- code |= TOP;\r
- return code;\r
- }\r
- \r
- public static boolean clipLineRectangle(Vector2f p1,Vector2f p2, Vector2f min, Vector2f max, Vector2f r1, Vector2f r2) {\r
- while (true) {\r
- int o1 = bitcode(p1, min, max);\r
- int o2 = bitcode(p2, min, max);\r
- int and = o1 & o2;\r
- int or = o1 | o2;\r
- if (and != IN) {\r
- return false;\r
- }\r
- if (or == IN) {\r
- r1.set(p1);\r
- r2.set(p2);\r
- return true;\r
- }\r
- if (o1 == IN) {\r
- Vector2f t = p1;\r
- p1 = p2;\r
- p2 = t;\r
- int t2 = o1;\r
- o1 = o2;\r
- o2 = t2;\r
- }\r
- if ((o1 & TOP) != IN) {\r
- float t = (max.y - p1.y) / (p2.y - p1.y);\r
- p1.x += t * (p2.x - p1.x);\r
- p1.y = max.y;\r
- } else if ((o1 & BOTTOM) != IN) {\r
- float t = (min.y - p1.y) / (p2.y - p1.y);\r
- p1.x += t * (p2.x - p1.x);\r
- p1.y = min.y;\r
- } else if ((o1 & LEFT) != IN) {\r
- float t = (min.x - p1.x) / (p2.x - p1.x);\r
- p1.y += t * (p2.y - p1.y);\r
- p1.x = min.x;\r
- } else if ((o1 & RIGHT) != IN) {\r
- float t = (max.x - p1.x) / (p2.x - p1.x);\r
- p1.y += t * (p2.y - p1.y);\r
- p1.x = max.x;\r
- } else {\r
- throw new RuntimeException("Error in clipping code");\r
- }\r
- }\r
- \r
- }\r
- \r
- public static double square(double d) {\r
- return d * d;\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import java.nio.ByteBuffer;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import org.eclipse.swt.graphics.ImageData;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.proconf.g3d.Resources;\r
-import org.simantics.proconf.g3d.stubs.ImageTexture;\r
-import org.simantics.proconf.g3d.stubs.TextureCoordinateGenerator;\r
-import org.simantics.proconf.image.interfaces.IImage;\r
-import org.simantics.proconf.image.interfaces.IImageFactory;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-import org.simantics.utils.ui.gfx.ImageUtils;\r
-import org.simantics.utils.ui.gfx.PixelDimension;\r
-\r
-import com.jme.image.Image;\r
-import com.jme.image.Texture;\r
-\r
-/**\r
- * Caches resource based textures.\r
- * TODO : use queries to update textures, now textures are read once and cannot be updated\r
- * TODO : either use shared context or use separate cache for each editor\r
- * TODO : ShapeNode implementation won't use release texture yet\r
- * TODO : Texture is released when reference count goes to zero; we probably want to wait for a while before texture is released because it might be used again.\r
- * TODO : Support for other types of textures (not just pattern texture, preferably extensible interface)\r
- * \r
- * @author Marko Luukkainen <Marko.Luukkainen@vtt.fi>\r
- *\r
- */\r
-public class ResourceTextureCache {\r
- \r
- public static PixelDimension DEFAULT_SIZE = new PixelDimension(128,128);\r
- \r
- private static ResourceTextureCache instance = new ResourceTextureCache();\r
- \r
- private Map<Resource,Image> images = new HashMap<Resource, Image>();\r
- private Map<Resource,Integer> imageReferences = new HashMap<Resource, Integer>();\r
- \r
- private Map<Resource,Texture> textures = new HashMap<Resource, Texture>();\r
- private Map<Resource,Integer> textureReferences = new HashMap<Resource, Integer>();\r
- \r
- \r
- private ResourceTextureCache() {\r
- \r
- }\r
- \r
- public Texture loadTexture(Graph g, Resource res) {\r
- Texture t = textures.get(res);\r
- if (t == null) {\r
- ImageTexture it = new ImageTexture(g,res);\r
- org.simantics.image.stubs.Image pattern = it.getImage();\r
- Image image = loadImage(g, pattern.getResource());\r
-\r
- if (image == null) {\r
- return null;\r
- }\r
- t = new Texture();\r
- t.setImage(image);\r
- \r
- \r
- t.setFilter(com.jme.image.Texture.FM_LINEAR);\r
- t.setMipmapState(com.jme.image.Texture.MM_LINEAR);\r
- t.setApply(Texture.AM_COMBINE);\r
- t.setCombineFuncRGB(Texture.ACF_MODULATE);\r
- t.setCombineScaleRGB(2.f);\r
-\r
- //t.setWrap(com.jme.image.Texture.WM_WRAP_S_WRAP_T);\r
- \r
- TextureCoordinateGenerator gen = it.getTextureCoordinateGenerator();\r
- setTextureCoordGenerator(gen, t);\r
- textures.put(res, t);\r
- }\r
- addTextureReference(res);\r
- return t;\r
- }\r
- \r
- public void releaseTexture(Graph g, Resource res) {\r
- Integer i = textureReferences.get(res);\r
- if (i != null) {\r
- i = i - 1;\r
- if (i == 0) {\r
- Texture t = textures.get(res);\r
- ImageTexture it = new ImageTexture(g,res);\r
- org.simantics.image.stubs.Image pattern = it.getImage();\r
- releaseImage(pattern.getResource());\r
- t.setImage(null);\r
- textureReferences.remove(res);\r
- //FIXME : release the texture\r
- } else {\r
- textureReferences.put(res, i);\r
- }\r
- \r
- } else {\r
- throw new RuntimeException("Cannot released texture that does not exist " + res);\r
- }\r
- }\r
- \r
- public Image loadImage(Graph g, Resource res) {\r
- Image image = images.get(res);\r
- if (image == null) {\r
- org.simantics.image.stubs.Image pattern = new org.simantics.image.stubs.Image(g,res);\r
- IImageFactory f = org.simantics.proconf.image.ImageUtils.getImageFactoryForResource(g,pattern.getResource());\r
- try {\r
- IImage p = f.createImageForResource(g,pattern.getResource());\r
- PixelDimension pd = p.getDimensions().getPixelDimension();\r
- if (pd==null) pd = DEFAULT_SIZE;\r
- ImageData data = p.rasterize(pd.getWidth(), pd.getHeight());\r
- image = getImage(data);\r
- images.put(res, image);\r
- \r
- } catch (Exception e) {\r
- ErrorLogger.defaultLogError("Cannor create pattern texture for resource " + pattern, e);\r
- return null;\r
- }\r
- }\r
- addImageReference(res);\r
- return image;\r
- \r
- }\r
- \r
- private void addTextureReference(Resource res) {\r
- Integer i = textureReferences.get(res);\r
- if (i != null) {\r
- imageReferences.put(res, i + 1);\r
- } else {\r
- imageReferences.put(res, 1);\r
- }\r
- }\r
- \r
- private void addImageReference(Resource res) {\r
- Integer i = imageReferences.get(res);\r
- if (i != null) {\r
- imageReferences.put(res, i + 1);\r
- } else {\r
- imageReferences.put(res, 1);\r
- }\r
- }\r
- \r
- public void releaseImage(Resource res) {\r
- Integer i = imageReferences.get(res);\r
- if (i != null) {\r
- i = i - 1;\r
- if (i == 0) {\r
- Image image = images.get(res);\r
- image.getData().clear();\r
- image.setData(null);\r
- images.remove(res);\r
- imageReferences.remove(res);\r
- } else {\r
- imageReferences.put(res, i);\r
- }\r
- } else {\r
- throw new RuntimeException("Cannot release image that does not exist.");\r
- }\r
- }\r
- \r
- public static ResourceTextureCache getInstance() {\r
- return instance;\r
- }\r
- \r
- public static Image getImage(ImageData imageData) {\r
- int width = imageData.width;\r
- int height = imageData.height;\r
- int type = 0;\r
- \r
- int components = 3;\r
- \r
- type = Image.RGB888;\r
- if (imageData.alphaData != null) {\r
- type = Image.RGBA8888;\r
- components = 4;\r
- }\r
- \r
- ByteBuffer buf = ByteBuffer.allocateDirect(components * width * height);\r
- ImageUtils.convertToRGBA(imageData, buf); \r
- return new Image(type,width,height,buf);\r
- }\r
- \r
- \r
- public static void setTextureCoordGenerator(TextureCoordinateGenerator gen, com.jme.image.Texture texture) {\r
- if (gen == null)\r
- return ;\r
-\r
- //g3dResource.\r
- if (gen.equals(Resources.g3dResource.TextureCoordinateGenerator_sphere))\r
- texture.setEnvironmentalMapMode(com.jme.image.Texture.EM_SPHERE);\r
- else if (gen.equals(Resources.g3dResource.TextureCoordinateGenerator_eyelinear))\r
- texture.setEnvironmentalMapMode(com.jme.image.Texture.EM_EYE_LINEAR);\r
- else if (gen.equals(Resources.g3dResource.TextureCoordinateGenerator_objectlinear))\r
- texture.setEnvironmentalMapMode(com.jme.image.Texture.EM_OBJECT_LINEAR);\r
- else if (gen.equals(Resources.g3dResource.TextureCoordinateGenerator_normal))\r
- ErrorLogger.getDefault().logWarning("JME doesn't support normal texture coordinate generation", null);\r
- else if (gen.equals(Resources.g3dResource.TextureCoordinateGenerator_reflection))\r
- ErrorLogger.getDefault().logWarning("JME doesn't support reflection texture coordinate generation", null);\r
- else\r
- ErrorLogger.getDefault().logWarning("Unsupported TexGen type " + gen.getName(), null);\r
- }\r
- \r
- public void clear() {\r
- for (Image i : images.values())\r
- i.setData(null);\r
- for (Texture t : textures.values())\r
- t.setImage(null);\r
- imageReferences.clear();\r
- textureReferences.clear();\r
- images.clear();\r
- textures.clear();\r
- \r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import java.util.Collection;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.proconf.g3d.scenegraph.IGeometryNode;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-\r
-import com.jme.scene.Node;\r
-\r
-public interface ScenegraphAdapter {\r
-\r
- /**\r
- * Disposes the adapter\r
- */\r
- public void dispose();\r
-\r
- /**\r
- * Returns scene-graph node of the resource\r
- * @param resource\r
- * @return\r
- */\r
- public IGraphicsNode getNode(Resource resource);\r
-\r
- /**\r
- * Returns scene-graph node of the resource\r
- * @param thing\r
- * @return\r
- */\r
- public IGraphicsNode getNode(IEntity thing);\r
-\r
- /**\r
- * Returns node (resource) for the uid.\r
- * @param uid\r
- * @return the node (resource)\r
- */\r
- public Resource getNodeResource(String uid);\r
-\r
- /**\r
- * @return all nodes in the scene-graph\r
- */\r
- public Collection<IGraphicsNode> getNodes();\r
-\r
- /**\r
- * Returns uid of the node.\r
- * @param nodeResource\r
- * @return\r
- */\r
- public String getNodeUID(Resource nodeResource);\r
-\r
- public JmeRenderingComponent getRenderingComponent();\r
-\r
- public Node getRoot();\r
-\r
- public IGraphicsNode getRootNode();\r
-\r
- public Resource getRootResource();\r
-\r
- /**\r
- * Returns true if the scene-graph contains the node\r
- * @param resource\r
- * @return\r
- */\r
- public boolean hasNode(Resource resource);\r
-\r
- /**\r
- * Checks if the view has been changed (and needs redrawing).\r
- * @return\r
- */\r
- public boolean isChanged();\r
-\r
- /**\r
- * Checks if any geometries needs updating\r
- * @return \r
- */\r
- public boolean needsUpdateGeometry();\r
-\r
- /**\r
- * \r
- * @param changed\r
- */\r
- public void setChanged(boolean changed);\r
-\r
- /**\r
- * Sets the root node of the scene-graph\r
- * @param rootNode\r
- */\r
- public void setRootNode(G3DNode rootNode);\r
-\r
- /**\r
- * Updates requested geometries.\r
- * \r
- * @param graph\r
- */\r
- public void updateGeometry(Graph graph);\r
-\r
- /**\r
- * Updates node's geometry\r
- * @param node\r
- */\r
- public void updateGeometry(IGeometryNode node);\r
- \r
- /**\r
- * Updates node's geometry\r
- * @param nodeResource\r
- */\r
- public void updateGeometry(Resource nodeResource);\r
-\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.HashMap;\r
-import java.util.HashSet;\r
-import java.util.List;\r
-import java.util.Queue;\r
-import java.util.Set;\r
-import java.util.concurrent.ConcurrentLinkedQueue;\r
-\r
-import org.simantics.db.AbstractQuery;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
-import org.simantics.db.queries.IGraphQuery;\r
-import org.simantics.db.queries.IQuery;\r
-import org.simantics.db.queries.IQueryListener;\r
-import org.simantics.db.utils.transaction.MergingTransactionRunner;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.Property;\r
-import org.simantics.proconf.g3d.Resources;\r
-import org.simantics.proconf.g3d.scenegraph.IGeometryNode;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.scenegraph.RootGraphicsNode;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-import org.simantics.utils.datastructures.BijectionMap;\r
-\r
-import com.jme.scene.Node;\r
-\r
-\r
-/**\r
- * Scene-graph adapter :\r
- * 1. Adapts graph change events into changes in actual scene-graph nodes.\r
- * 2. Handles instantiating and disposing of Scene-graph nodes.\r
- * 3. \r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public abstract class ScenegraphAdapterImpl implements ScenegraphAdapter {\r
- \r
- protected static boolean DEBUG = false;\r
- \r
- private RootGraphicsNode root;\r
- private HashMap<Resource,ScenegraphQuery> scenegraphQueries = new HashMap<Resource, ScenegraphQuery>();\r
- private HashMap<Resource,NodePropertyQuery> propertyQueries = new HashMap<Resource, NodePropertyQuery>();\r
- private HashMap<Resource,NodeTransformationQuery> transformationQueries = new HashMap<Resource, NodeTransformationQuery>();\r
- private HashMap<Resource, IGraphicsNode> abstractGraphicsNodes = new HashMap<Resource, IGraphicsNode>();\r
- protected Queue<IGeometryNode> geometryUpdates = new ConcurrentLinkedQueue<IGeometryNode>();\r
- \r
- private BijectionMap<Resource, String> nameMap = new BijectionMap<Resource, String>();\r
- \r
- protected JmeRenderingComponent component;\r
- \r
- protected boolean viewChanged = false;\r
- \r
- protected Session session;\r
- \r
- private MergingTransactionRunner transactionRunner;\r
- \r
- public ScenegraphAdapterImpl(Session session, JmeRenderingComponent component) {\r
- this.component = component;\r
- this.session = session;\r
- transactionRunner = new MergingTransactionRunner(session,true);\r
- }\r
- \r
- \r
- @Override\r
- public JmeRenderingComponent getRenderingComponent() {\r
- return component;\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.simantics.g3d.scenegraph.IScenegraphAdapter#setRootNode(fi.vtt.simantics.g3d.stubs.G3DNode)\r
- */\r
- public void setRootNode(G3DNode rootNode) {\r
- addSubnodeListener(rootNode);\r
- root = new RootGraphicsNode(component,rootNode.getResource());\r
- abstractGraphicsNodes.put(rootNode.getResource(),root);\r
- G3DTools.reloadCache(rootNode.getGraph(),root.getResource());\r
- addRootPropertyListener(rootNode.getGraph());\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.simantics.g3d.scenegraph.IScenegraphAdapter#needsUpdateGeometry()\r
- */\r
- public boolean needsUpdateGeometry() {\r
- return geometryUpdates.size() > 0;\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.simantics.g3d.scenegraph.IScenegraphAdapter#updateGeometry(fi.vtt.simantics.g3d.scenegraph.IGeometryNode)\r
- */\r
- public void updateGeometry(IGeometryNode node) {\r
- geometryUpdates.add(node);\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.simantics.g3d.scenegraph.IScenegraphAdapter#updateGeometry(fi.vtt.simantics.db.connection.Resource)\r
- */\r
- public void updateGeometry(Resource nodeResource) {\r
- geometryUpdates.add((IGeometryNode)abstractGraphicsNodes.get(nodeResource));\r
- }\r
- \r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.simantics.g3d.scenegraph.IScenegraphAdapter#updateGeometry(fi.vtt.simantics.db.connection.Graph)\r
- */\r
- public synchronized void updateGeometry(Graph graph) {\r
- if (geometryUpdates.size() > 0) {\r
- for (IGeometryNode n : geometryUpdates) {\r
- try {\r
- n.updateGeometry(graph);\r
- if (DEBUG) System.out.println("ScenegraphAdapterImpl: geometryUpdated " + n.getResource());\r
- } catch (Exception e) {\r
- ErrorLogger.defaultLogError("Failed to update geometry of node" + n.getResource(), e);\r
- }\r
- }\r
- geometryUpdates.clear();\r
- viewChanged = true;\r
- //if (DEBUG) System.out.println("ScenegraphAdapterImpl: geometryUpdated");\r
- }\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.simantics.g3d.scenegraph.IScenegraphAdapter#getNodes()\r
- */\r
- public Collection<IGraphicsNode> getNodes() {\r
- return abstractGraphicsNodes.values();\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.simantics.g3d.scenegraph.IScenegraphAdapter#getNode(fi.vtt.simantics.db.connection.Resource)\r
- */\r
- public IGraphicsNode getNode(Resource resource) {\r
- return abstractGraphicsNodes.get(resource);\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.simantics.g3d.scenegraph.IScenegraphAdapter#getRootNode()\r
- */\r
- public IGraphicsNode getRootNode() {\r
- return getNode(getRootResource());\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.simantics.g3d.scenegraph.IScenegraphAdapter#getNode(fi.vtt.simantics.layer0.utils.IEntity)\r
- */\r
- public IGraphicsNode getNode(IEntity IEntity) {\r
- return abstractGraphicsNodes.get(IEntity.getResource());\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.simantics.g3d.scenegraph.IScenegraphAdapter#getNodeResource(java.lang.String)\r
- */\r
- public Resource getNodeResource(String uid) {\r
- return nameMap.getLeft(uid);\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.simantics.g3d.scenegraph.IScenegraphAdapter#getNodeUID(fi.vtt.simantics.db.connection.Resource)\r
- */\r
- public String getNodeUID(Resource nodeResource) {\r
- String name = nameMap.getRight(nodeResource);\r
- if (name == null) {\r
- //name = UUID.randomUUID().toString();\r
- name = Long.toString(nodeResource.getResourceId());\r
- nameMap.map(nodeResource, name);\r
- }\r
- return name;\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.simantics.g3d.scenegraph.IScenegraphAdapter#hasNode(fi.vtt.simantics.db.connection.Resource)\r
- */\r
- public boolean hasNode(Resource resource) {\r
- return abstractGraphicsNodes.containsKey(resource);\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.simantics.g3d.scenegraph.IScenegraphAdapter#getRootResource()\r
- */\r
- public Resource getRootResource() {\r
- if (root == null)\r
- return null;\r
- return root.getResource();\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.simantics.g3d.scenegraph.IScenegraphAdapter#getRoot()\r
- */\r
- public Node getRoot() {\r
- return root.getGroup();\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.simantics.g3d.scenegraph.IScenegraphAdapter#dispose()\r
- */\r
- public void dispose() {\r
- Set<Resource> shapes = new HashSet<Resource>(abstractGraphicsNodes.keySet());\r
- for (Resource r : shapes) {\r
- removeNode(r);\r
- }\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.simantics.g3d.scenegraph.IScenegraphAdapter#isChanged()\r
- */\r
- public boolean isChanged() {\r
- return viewChanged;\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.simantics.g3d.scenegraph.IScenegraphAdapter#setChanged(boolean)\r
- */\r
- public void setChanged(boolean changed) {\r
- viewChanged = changed;\r
- }\r
- \r
- \r
- /**\r
- * Instantiates Listener that listens hierarchy changes in the node (subnode\r
- * added and/or removed)\r
- * \r
- * @param node\r
- * @return\r
- */\r
- protected abstract ScenegraphQuery newSubnodeListener(G3DNode node);\r
- \r
- protected void addSubnodeListener(G3DNode node) {\r
- if (DEBUG) System.out.println("ScenegraphAdapter.addSubnodeListener( " + node.getResource() + " )");\r
- ScenegraphQuery q = newSubnodeListener(node);\r
- node.getGraph().performQuery(q);\r
- scenegraphQueries.put(node.getResource(), q);\r
- }\r
- \r
- /**\r
- * Returns propertyQuery for a single scene-graph node.\r
- * @param node\r
- * @return\r
- */\r
- protected abstract NodePropertyQuery newPropertyListener(G3DNode node);\r
- \r
- /**\r
- * Returns transformationQuery for a single scene-graph node\r
- * @param root\r
- * @return\r
- */\r
- protected abstract NodeTransformationQuery newTransformationListener(G3DNode node);\r
- \r
- /**\r
- * Returns propertyQuery for the root node.\r
- * May return null if root node has no interesting properties.\r
- * \r
- * Potentially root node could contain lighting settings, and so on...\r
- * \r
- * @param root\r
- * @return\r
- */\r
- protected abstract NodePropertyQuery newRootPropertyListener(G3DNode root);\r
- \r
- protected void addPropertyListener(G3DNode node) {\r
- if (DEBUG) System.out.println("ScenegraphAdapter.addPropertyListener( " + node.getResource() + " )");\r
- NodePropertyQuery q = newPropertyListener(node);\r
- node.getGraph().performQuery(q);\r
- propertyQueries.put(node.getResource(),q);\r
- }\r
- \r
- \r
- protected void addTransformationListener(G3DNode node) {\r
- if (DEBUG) System.out.println("ScenegraphAdapter.addPropertyListener( " + node.getResource() + " )");\r
- NodeTransformationQuery q = newTransformationListener(node);\r
- node.getGraph().performQuery(q);\r
- transformationQueries.put(node.getResource(),q);\r
- }\r
- \r
- protected void addRootPropertyListener(Graph g) {\r
- G3DNode node = root.getG3DNode(g);\r
- if (DEBUG) System.out.println("ScenegraphAdapter.addRootPropertyListener( " + node.getResource() + " )"); \r
- NodePropertyQuery q = newRootPropertyListener(node);\r
- if (q == null)\r
- return;\r
- node.getGraph().performQuery(q);\r
- propertyQueries.put(node.getResource(),q);\r
- }\r
- \r
- /**\r
- * Instantiates a new scene-graph node\r
- * \r
- * @param parent the parent of the new node.\r
- * @param node the new node.\r
- * @return\r
- */\r
- protected abstract IGraphicsNode instantiateNode(IGraphicsNode parent, G3DNode node);\r
- \r
-\r
- /**\r
- * Adds node into scene-graph\r
- * @param parent the parent of the node\r
- * @param r resource of the node\r
- * @return created scene-graph node\r
- */\r
- protected IGraphicsNode addNode(IEntity parent, IEntity r) {\r
- if (!r.isInstanceOf(Resources.g3dResource.G3DNode)) {\r
- ErrorLogger.defaultLogError("Trying to add node into scenegraph that is not instance of G3DNode " + r,new Exception("ASSERT!"));\r
- return null;\r
- }\r
- if (parent.equals(r)) {\r
- if (DEBUG) System.out.println("ThreeDimensionalEditorBase.addNodeP(" + r.getResource().getResourceId() + ") adding node to itself?!");\r
- ErrorLogger.defaultLogError("Adding scnegraphnode " + r.getResource().getResourceId() + " to itself!", new Exception("ASSERT!"));\r
- return abstractGraphicsNodes.get(r);\r
- }\r
- \r
- if (abstractGraphicsNodes.containsKey(r)) {\r
- \r
- IGraphicsNode inView = abstractGraphicsNodes.get(r);\r
- if (inView.getParent() == null) {\r
- //if graphicsNode has no parent it must be the root node\r
- ErrorLogger.defaultLogError("Trying to add rootnode into scenegraph " + r, null);\r
- return null;\r
- }\r
- if (parent.equals(inView.getParent().getResource())) {\r
- if (DEBUG) System.out.println("ThreeDimensionalEditorBase.addNodeP(" + r.getResource().getResourceId() + ") already in view");\r
- return inView;\r
- } else {\r
- if (DEBUG) System.out.println("ThreeDimensionalEditorBase.addNodeP(" + r.getResource().getResourceId() + ") already in view, but has different parent, current parent is ("+inView.getParent().getResource().getResourceId()+") and node is added to ("+parent+") -> removing from old parent and inserting to new");\r
- removeNode(inView.getParent().getResource(),r.getResource());\r
- }\r
- }\r
- \r
- G3DNode node = new G3DNode(r);\r
-\r
- IGraphicsNode mo;\r
- IGraphicsNode parentNode = abstractGraphicsNodes.get(parent);\r
- if (parentNode == null) {\r
- if (DEBUG) System.out.println("No graphicsnode for (" + parent.getResource().getResourceId() + ")");\r
- return null;\r
- } else {\r
- mo = instantiateNode(parentNode, node);\r
- if (mo == null) {\r
- ErrorLogger.defaultLogError("Could not instantiate scenegraph node for " + r.getResource().getResourceId(), null);\r
- return null;\r
- }\r
- if (DEBUG) System.out.println("ThreeDimensionalEditorBase.addNodeP(" + r.getResource().getResourceId() + ") added to parent (" + parent.getResource().getResourceId() + ") " + mo.getClass());\r
- }\r
- addSubnodeListener(node);\r
- addPropertyListener(node);\r
- addTransformationListener(node);\r
-\r
- abstractGraphicsNodes.put(r.getResource(), mo);\r
-\r
- \r
- \r
- // FIXME : this is a hack to fix transformations of instantiated nodes\r
-// if (graph.getCurrentTransaction() != null) {\r
-// try {\r
-// G3DTools.propagateWorldTransformChange(parentNode\r
-// .getG3DNode());\r
-// graph.commitChanges(CommitMessage.CHANGE_MESSAGE);\r
-// // G3DNodeTools.transformationUpdate(graph, r.getId());\r
-// } catch (Exception e) {\r
-// ErrorLogger.defaultLogError(e);\r
-// }\r
-// }\r
-\r
- \r
- return mo;\r
- }\r
-\r
- /**\r
- * This is used only when view is disposed!\r
- * \r
- * @param r\r
- */\r
- private void removeNode(Resource r) {\r
- NodeTransformationQuery tq = transformationQueries.get(r);\r
- //StructuralChangeMonitor monitor = monitors.getLeft(r);\r
- if (tq == null) {\r
- if (abstractGraphicsNodes.containsKey(r)) {\r
- // root node has no monitor (no transformation to monitor)\r
- //System.out.println("ThreeDimensionalEditorBase.removeNode(" + r + ") node has no monitor, but has node in scenegraph"); \r
- abstractGraphicsNodes.remove(r);\r
- if(scenegraphQueries.get(r) != null) {\r
- scenegraphQueries.get(r).dispose();\r
- scenegraphQueries.remove(r);\r
- }\r
- } else {\r
- //System.out.println("ThreeDimensionalEditorBase.removeNode(" + r + ") not in view");\r
- }\r
- return;\r
- }\r
- // remove listeners\r
- propertyQueries.remove(r).dispose(); \r
- transformationQueries.remove(r).dispose();\r
- scenegraphQueries.get(r);\r
- scenegraphQueries.remove(r).dispose();\r
- // remove children\r
- IGraphicsNode node = abstractGraphicsNodes.get(r);\r
- ArrayList<IGraphicsNode> children = new ArrayList<IGraphicsNode>(node.getChildren());\r
- for (IGraphicsNode n : children) {\r
- removeNode(n.getResource());\r
- }\r
- // remove the node\r
- if (DEBUG) System.out.println("ThreeDimensionalEditorBase.removeNode(" + r + ") removed");\r
- \r
- node.dispose();\r
- abstractGraphicsNodes.remove(r);\r
-\r
- }\r
- \r
- /**\r
- * Removes a scene-graph node.\r
- * @param parent the parent of the node\r
- * @param r the node.\r
- */\r
- protected void removeNode(Resource parent,Resource r) {\r
- NodePropertyQuery q = propertyQueries.get(r);\r
- if (q == null) {\r
- assert(!abstractGraphicsNodes.containsKey(r));\r
- if (DEBUG) System.out.println("ThreeDimensionalEditorBase.removeNodeP(" + r + ") not in view");\r
- return;\r
- }\r
- \r
- IGraphicsNode node = abstractGraphicsNodes.get(r);\r
- Resource rParent = node.getParent().getResource();\r
- if (!rParent.equals(parent)) {\r
- // this event may happen, depending of the order of events in transaction\r
- if (DEBUG) System.out.println("ThreeDimensionalEditorBase.removeNodeP(" + r + ") trying to remove from wrong parent current ("+rParent+") remove parentnode null("+parent+")"); \r
- return;\r
- }\r
- // removing listeners\r
- propertyQueries.remove(r).dispose();\r
- transformationQueries.remove(r).dispose();\r
- scenegraphQueries.remove(r).dispose();\r
- // remove node's children\r
- ArrayList<IGraphicsNode> children = new ArrayList<IGraphicsNode>(node.getChildren());\r
- for (IGraphicsNode n : children) {\r
- removeNode(r,n.getResource());\r
- } \r
- if (DEBUG) System.out.println("ThreeDimensionalEditorBase.removeNodeP(" + r + ") from ("+parent+")"); \r
- // remove the node\r
- \r
- abstractGraphicsNodes.remove(r);\r
- if (geometryUpdates.contains(node)) {\r
- geometryUpdates.remove(node);\r
- }\r
- node.dispose();\r
- }\r
-\r
- \r
- /**\r
- * Query that tracks changes in resources.\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
- public abstract class NodeQuery extends AbstractQuery<Object>{\r
- protected Resource nodeResource;\r
- private boolean disposed = false;\r
- \r
- private IQueryListener listener = null;\r
- \r
- public NodeQuery(Resource r) {\r
- this.nodeResource = r;\r
- }\r
- \r
- protected abstract Object compute2(Graph graph);\r
- \r
- @Override\r
- public Object performQuery(Graph graph) {\r
- if (disposed) return null;\r
- return compute2(graph);\r
- }\r
- \r
- /**\r
- * \r
- * @param oldResult result of the query before the change.\r
- * @param newResult result of the query after the change.\r
- */\r
- public abstract boolean updated(Graph graph, Object oldResult, Object newResult);\r
- \r
- @Override\r
- public int getType() {\r
- return IQuery.SCHEDULED_UPDATE;\r
- }\r
- \r
- @Override\r
- public void resultChangedRaw(final Object oldResult, final Object newResult) {\r
- if (disposed)\r
- throw new RuntimeException("Updating disposed query"); //return;\r
- transactionRunner.run(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- if (!disposed) {\r
- if (oldResult == IQueryListener.NO_VALUE)\r
- updated(g, null, newResult);\r
- else\r
- updated(g, oldResult, newResult);\r
- } \r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
-\r
- }\r
- \r
- \r
- @Override\r
- public boolean equalsQuery(IGraphQuery<Object> other) {\r
- return nodeResource.equals(((NodeQuery)other).nodeResource);\r
- }\r
- \r
- @Override\r
- final public int hash() {\r
- return nodeResource.hashCode();\r
- }\r
- \r
- \r
- /**\r
- * Disposes the query\r
- */\r
- public void dispose() {\r
- disposed = true;\r
- if (DEBUG) System.out.println("NodeQuery " + nodeResource + " disposed()" + " " + this.getClass());\r
- }\r
- \r
- @Override\r
- public boolean isDisposed() {\r
- return disposed;\r
- }\r
- \r
- // without separate listener, this query would work only once\r
- @Override\r
- public IQueryListener getListener() {\r
- if (listener == null) {\r
- listener = new IQueryListener() {\r
- @Override\r
- public boolean isDisposed() {\r
- return NodeQuery.this.disposed;\r
- }\r
- \r
- @Override\r
- public void resultChangedRaw(Object oldResult, Object newResult) {\r
- NodeQuery.this.resultChangedRaw(oldResult, newResult);\r
- }\r
- };\r
- }\r
- return listener;\r
- }\r
- }\r
- \r
- /**\r
- * \r
- * Query that tracks changes in scene-graph structure (parent/child relationships).\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
- public abstract class ScenegraphQuery extends NodeQuery {\r
- \r
- List<Resource> added = new ArrayList<Resource>();\r
- List<Resource> removed = new ArrayList<Resource>();\r
- \r
- private boolean initialized;\r
- \r
- public ScenegraphQuery(Resource nodeResource) {\r
- super(nodeResource);\r
- initialized = false;\r
- if(DEBUG)System.out.println("ScenegraphQuery created for " + nodeResource);\r
- }\r
- \r
- @Override\r
- public List<Resource> compute2(Graph g) {\r
- IEntity node = EntityFactory.create(g,nodeResource);\r
- Collection<IEntity> children = node.getRelatedObjects(Resources.g3dResource.HasChild);\r
- List<Resource> list = new ArrayList<Resource>();\r
- for (IEntity n: children)\r
- list.add(n.getResource());\r
- if (DEBUG) System.out.println("ScenegraphQuery " + nodeResource + " has " + list.size() + " children");\r
- return list;\r
- }\r
- \r
- @SuppressWarnings("unchecked")\r
- @Override\r
- public boolean updated(Graph graph, Object oldResult, Object newResult) {\r
- List<Resource> oldChildren;\r
- if (oldResult != null)\r
- oldChildren = (List<Resource>)oldResult;\r
- else\r
- oldChildren = new ArrayList<Resource>();\r
- List<Resource> newChildren = (List<Resource>)newResult;\r
- \r
- if (DEBUG) System.out.println("ScenegraphQuery " + nodeResource + " updated: had " + oldChildren.size() + " children, but now has " + newChildren.size() + " children");\r
- added.clear();\r
- removed.clear();\r
- if (initialized) {\r
- for (Resource r : oldChildren)\r
- if (!newChildren.contains(r))\r
- removed.add(r);\r
- for (Resource r : newChildren)\r
- if (!oldChildren.contains(r))\r
- added.add(r);\r
- for (Resource r : removed) {\r
- if (DEBUG)\r
- System.out.println("ScenegraphQuery " + nodeResource\r
- + " removed " + r);\r
- removeNode(nodeResource, r);\r
- }\r
- if (added.size() > 0) {\r
- G3DNode parent = new G3DNode(graph, nodeResource);\r
- /*\r
- * try {\r
- * \r
- * G3DTools.propagateTransformChange(parent); } catch\r
- * (Exception e) { ErrorLogger.defaultLogError(e); }\r
- */\r
- for (Resource r : added) {\r
- IEntity e = EntityFactory.create(graph, r);\r
- G3DTools.propagateLocalTransformChange(parent, e);\r
- IGraphicsNode n = addNode(parent, e);\r
- shapeAdded(graph, n);\r
- }\r
- }\r
- return (added.size() > 0 || removed.size() > 0);\r
- } else {\r
- // when query is run for the first time, we can assume that transformations are correct.\r
- initialized = true;\r
- for (Resource r : newChildren)\r
- added.add(r);\r
- if (added.size() > 0) {\r
- G3DNode parent = new G3DNode(graph, nodeResource);\r
- for (Resource r : added) {\r
- IEntity e = EntityFactory.create(graph, r);\r
- IGraphicsNode n = addNode(parent, e);\r
- shapeAdded(graph, n);\r
- }\r
- return true;\r
- }\r
- return false;\r
- }\r
- \r
- }\r
- \r
- \r
- /**\r
- * This method is run after a node is added to scene-graph.\r
- * \r
- * @param graph Graph of the current transaction.\r
- * @param node the newly added scene-graph node\r
- */\r
- public abstract void shapeAdded(Graph graph,IGraphicsNode node);\r
- \r
-// @Override\r
-// public void attach() {\r
-// scenegraphQueries.put(nodeResource, this);\r
-// }\r
- \r
- \r
- }\r
- \r
- /**\r
- * Tracks changes in scene-graph nodes' properties\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
- public abstract class NodePropertyQuery extends NodeQuery {\r
- \r
- private boolean initialized;\r
- \r
- public NodePropertyQuery(Resource nodeResource) {\r
- super(nodeResource);\r
- initialized = false;\r
- if(DEBUG)System.out.println("NodePropertyQuery created for " + nodeResource);\r
- }\r
- \r
- @Override\r
- public List<Object> compute2(Graph g) {\r
- IEntity t = EntityFactory.create(g,nodeResource);\r
- \r
- Collection<Property> properties = t.getRelatedProperties(Resources.g3dResource.HasNonTransformation);\r
- List<Object> propertyValues = new ArrayList<Object>();\r
- p(properties,propertyValues);\r
-\r
- return propertyValues;\r
- }\r
- \r
- private void p(Collection<Property> properties, List<Object> propertyValues) {\r
- for (Property p : properties) {\r
- Collection<Property> subProperties = p.getRelatedProperties(p.getGraph().getBuiltins().HasProperty);\r
- if (subProperties.size() != 0) {\r
- p(subProperties,propertyValues);\r
- } \r
- if (p.hasValue()){\r
- propertyValues.add(p.getValue());\r
- }\r
- }\r
- }\r
- \r
- @Override\r
- public boolean updated(Graph graph, Object oldResult, Object newResult) {\r
- if (initialized) {\r
- if (DEBUG) System.out.println("NodePropertyQuery changed " + nodeResource + " " + abstractGraphicsNodes.size());\r
- IGraphicsNode mo = abstractGraphicsNodes.get(nodeResource);\r
- if (mo == null) {\r
- if (DEBUG) System.out.println("NodePropertyQuery invalid change " + nodeResource + " " + abstractGraphicsNodes.size());\r
- ErrorLogger.defaultLogError("Got update from resource " + nodeResource + " but its not part of the scenegraph", null);\r
- dispose();\r
- return false;\r
- }\r
- shapeUpdated(graph,mo);\r
- return true;\r
- } else {\r
- initialized = true;\r
- return false;\r
- }\r
- }\r
-\r
- \r
- /**\r
- * This method is run when a scene-graph node is changed.\r
- * \r
- * @param shape the changed node\r
- */\r
- public abstract void shapeUpdated(Graph graph,IGraphicsNode shape);\r
- \r
-// @Override\r
-// public void attach() {\r
-// propertyQueries.put(nodeResource, this);\r
-// }\r
- \r
- }\r
- \r
- public abstract class NodeTransformationQuery extends NodeQuery {\r
- \r
- private boolean initialized;\r
- \r
- public NodeTransformationQuery(Resource nodeResource) {\r
- super(nodeResource);\r
- initialized = false;\r
- if(DEBUG)System.out.println("NodeTransformationQuery created for " + nodeResource);\r
- }\r
- \r
- @Override\r
- public List<Object> compute2(Graph g) {\r
- IEntity t = EntityFactory.create(g,nodeResource);\r
- \r
- Collection<Property> properties = t.getRelatedProperties(Resources.g3dResource.HasTransformation);\r
- \r
- List<Object> propertyValues = new ArrayList<Object>();\r
- p(properties,propertyValues);\r
- return propertyValues;\r
-\r
- }\r
- \r
- private void p(Collection<Property> properties, List<Object> propertyValues) {\r
- for (Property p : properties) {\r
- Collection<Property> subProperties = p.getRelatedProperties(p.getGraph().getBuiltins().HasProperty);\r
- if (subProperties.size() != 0) {\r
- p(subProperties,propertyValues);\r
- } \r
- if (p.hasValue()){\r
- propertyValues.add(p.getValue());\r
- }\r
- }\r
- }\r
- \r
- @Override\r
- public boolean updated(Graph graph,Object oldResult, Object newResult) {\r
- if (initialized) {\r
- if (DEBUG) System.out.println("NodeTransformationQuery changed " + nodeResource + " " + abstractGraphicsNodes.size());\r
-\r
- G3DTools.transformationUpdate(graph, nodeResource);\r
-\r
- IGraphicsNode mo = abstractGraphicsNodes.get(nodeResource);\r
- if (mo == null) {\r
- if (DEBUG) System.out.println("NodeTransformationQuery invalid change " + nodeResource + " " + abstractGraphicsNodes.size());\r
- ErrorLogger.defaultLogError("Got update from resource " + nodeResource + " but its not part of the scenegraph", null);\r
- dispose();\r
- return false;\r
- }\r
- shapeUpdated(graph,mo);\r
- return true;\r
- } else {\r
- initialized = true;\r
- return false;\r
- }\r
- }\r
-\r
- \r
- /**\r
- * This method is run when a scene-graph node is changed.\r
- * \r
- * @param shape the changed node\r
- */\r
- public abstract void shapeUpdated(Graph graph,IGraphicsNode shape);\r
- \r
-// @Override\r
-// public void attach() {\r
-// transformationQueries.put(nodeResource, this);\r
-// }\r
- \r
- }\r
- \r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-import org.eclipse.jface.viewers.ISelection;\r
-import org.eclipse.jface.viewers.ISelectionChangedListener;\r
-import org.eclipse.jface.viewers.ISelectionProvider;\r
-import org.eclipse.jface.viewers.SelectionChangedEvent;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-import org.simantics.proconf.g3d.gizmo.Gizmo;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.ui.utils.ResourceAdaptionUtils;\r
-\r
-import com.jme.intersection.PickData;\r
-import com.jme.intersection.PickResults;\r
-import com.jme.intersection.TrianglePickResults;\r
-import com.jme.math.Ray;\r
-\r
-import org.simantics.db.Resource;\r
-\r
-/**\r
- * Manages highlighting and selecting of objects.\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public abstract class SelectionAdapter implements ISelectionProvider{\r
- \r
- protected ScenegraphAdapter adapter;\r
- \r
- private Gizmo currentGizmo = null;\r
- \r
- public SelectionAdapter(ScenegraphAdapter adapter) {\r
- if (adapter == null)\r
- throw new NullPointerException("Scenegraph adapter must no be null");\r
- this.adapter = adapter;\r
- }\r
- \r
- public enum SelectionType {\r
- SET, MODIFY\r
- };\r
-\r
- protected SelectionType mouseClickType = SelectionType.SET;\r
- \r
- public SelectionType getSelectionType() {\r
- return mouseClickType;\r
- }\r
- \r
- public void setSelectionType(SelectionType type) {\r
- mouseClickType = type;\r
- }\r
- \r
- public void setCurrentGizmo(Gizmo gizmo) {\r
- currentGizmo = gizmo;\r
- }\r
- \r
- /**\r
- * Lists all selected objects\r
- * <p>\r
- * Selection may contain objects that are not in this view: those are NOT\r
- * returned\r
- * </p>\r
- * \r
- * @return\r
- */\r
- public List<IGraphicsNode> getSelectedObjects() {\r
- return getSelectedObjects(selection);\r
- }\r
- \r
- /**\r
- * Lists all highlighted objects.\r
- * <p>\r
- * Typically there may be only one highlighted object.\r
- * </p>\r
- * @return\r
- */\r
- public List<IGraphicsNode> getHighlightedObjects() {\r
- return getSelectedObjects(interactiveSelection);\r
- }\r
-\r
- /**\r
- * Lists all selected objects\r
- * <p>\r
- * Selection may contain objects that are not in this view: those are NOT\r
- * returned\r
- * </p>\r
- * \r
- * @return\r
- */\r
- public List<IGraphicsNode> getInteractiveSelectedObjects() {\r
- return getSelectedObjects(interactiveSelection);\r
- }\r
-\r
- /**\r
- * Lists all selected objects\r
- * <p>\r
- * Selection may contain objects that are not in this view: those are NOT\r
- * returned\r
- * </p>\r
- * \r
- * @return\r
- */\r
- protected List<IGraphicsNode> getSelectedObjects(StructuredResourceSelection selection) {\r
- List<IGraphicsNode> l = new ArrayList<IGraphicsNode>();\r
- Iterator<Resource> i = selection.iterator();\r
- while (i.hasNext()) {\r
- Resource s = i.next();\r
- IGraphicsNode shape = adapter.getNode(s);\r
- if (shape != null)\r
- l.add(shape);\r
-\r
- }\r
- return l;\r
- }\r
-\r
- /**\r
- * Return selected objects\r
- * <p>\r
- * May contain objects that are NOT in this view\r
- * </p>\r
- * \r
- * @return\r
- */\r
- public List<Resource> getSelectedResources() {\r
- List<Resource> l = new ArrayList<Resource>();\r
- Iterator<Resource> i = selection.iterator();\r
- while (i.hasNext()) {\r
- Resource s = (Resource) i.next();\r
- l.add(s);\r
-\r
- }\r
- return l;\r
- }\r
- \r
- private ArrayList<PickData> processed = new ArrayList<PickData>();\r
- \r
- private class ExtTrianglePickResults extends TrianglePickResults {\r
- public ExtTrianglePickResults() {\r
- this.setCheckDistance(true);\r
- }\r
- \r
- public void processPick() {\r
- processed.clear();\r
- if (getNumber() > 0) {\r
- for (int j = 0; j < getNumber(); j++) {\r
- PickData pData = getPickData(j);\r
- ArrayList<Integer> tris = pData.getTargetTris();\r
- if (tris != null && tris.size() > 0) {\r
- processed.add(pData);\r
- }\r
- }\r
- \r
- }\r
- \r
- }\r
- }\r
- \r
- private PickResults result = new ExtTrianglePickResults();\r
-\r
- \r
- private void pickPrefix(String prefix) {\r
-\r
- ArrayList<PickData> r= new ArrayList<PickData>();\r
- for (int i = 0; i < processed.size(); i++) {\r
- PickData pData = processed.get(i);\r
- if (pData.getTargetMesh().getParentGeom().getName().startsWith(prefix))\r
- r.add(pData);\r
- }\r
- processed = r;\r
- }\r
- \r
- /**\r
- * Updates highlighted objects according to mouse position.\r
- * \r
- * @param mouseRay\r
- */\r
- public void updateHighlights(Ray mouseRay) {\r
- result.clear();\r
- adapter.getRenderingComponent().getRoot().calculatePick(mouseRay, result);\r
- if (currentGizmo != null) {\r
- pickPrefix(currentGizmo.getPickPrefix());\r
- }\r
- doHighlightPick(processed);\r
- }\r
- \r
- /**\r
- * Picks highlighted objects\r
- */\r
- public void pickHighlighted() {\r
- doPick(processed);\r
- }\r
- \r
- /**\r
- * Processes pick.\r
- * @param result\r
- */\r
- protected void doPick(ArrayList<PickData> result) {\r
- if (result != null) {\r
-\r
- if (result.size() == 0) {\r
- if (mouseClickType != SelectionType.MODIFY)\r
- updateSelection(new StructuredResourceSelection());\r
- return;\r
- }\r
- \r
- String nodeName = result.get(0).getTargetMesh().getParentGeom().getName();\r
-\r
- StructuredResourceSelection s = new StructuredResourceSelection();\r
- \r
- Resource selectedResource = adapter.getNodeResource(nodeName);\r
- if (adapter.getNode(selectedResource) == null) {\r
- updateSelection(new StructuredResourceSelection());\r
- return;\r
- //throw new RuntimeException("Picked resource that has no node ?!");\r
- }\r
- if (mouseClickType == SelectionType.MODIFY) {\r
- ArrayList<Resource> selected = new ArrayList<Resource>(getSelectedResources());\r
- if (selected.contains(selectedResource))\r
- selected.remove(selectedResource);\r
- else\r
- selected.add(selectedResource);\r
- for (Resource r : selected)\r
- s.add(r);\r
-\r
- } else {\r
- s.add(selectedResource);\r
- }\r
-\r
- updateSelection(s);\r
- } else {\r
- // System.out.println("Picked nothing");\r
- if (mouseClickType != SelectionType.MODIFY)\r
- updateSelection(new StructuredResourceSelection());\r
- }\r
- }\r
-\r
- /**\r
- * Processes highlight pick\r
- * @param result\r
- */\r
- protected void doHighlightPick(ArrayList<PickData> result) {\r
- if (result != null) {\r
-\r
- if (result.size() == 0) {\r
- updateGizmo(null);\r
- //System.out.println("IPicked nothing");\r
- updateHighlightSelection(new StructuredResourceSelection());\r
- return;\r
- }\r
- \r
- String nodeName = result.get(0).getTargetMesh().getParentGeom().getName();\r
- \r
- updateGizmo(null);\r
- \r
- // System.out.println("hits: " + result);\r
- StructuredResourceSelection s = new StructuredResourceSelection();\r
- \r
- Resource selectedResource = adapter.getNodeResource(nodeName);\r
- \r
- if (selectedResource == null) {\r
- if (currentGizmo != null && nodeName.startsWith(currentGizmo.getPickPrefix())) {\r
- updateGizmo(nodeName);\r
- } \r
- return;\r
- }\r
- \r
- if (adapter.getNode(selectedResource) != null)\r
- s.add(selectedResource);\r
-\r
- updateHighlightSelection(s);\r
- } else {\r
- updateGizmo(null);\r
- // System.out.println("IPicked nothing");\r
- updateHighlightSelection(new StructuredResourceSelection());\r
- }\r
- }\r
- \r
- /**\r
- * Updates gizmo according to picked object\r
- * @param pickName\r
- */\r
- private void updateGizmo(String pickName) {\r
- if (currentGizmo != null) {\r
- currentGizmo.setSelected(pickName);\r
- if (currentGizmo.isChanged()) {\r
- adapter.setChanged(true);\r
- currentGizmo.setChanged(false);\r
- }\r
- }\r
- }\r
- \r
- \r
- /**\r
- * Contains selection\r
- */\r
- protected StructuredResourceSelection selection = new StructuredResourceSelection();\r
-\r
- protected StructuredResourceSelection interactiveSelection = new StructuredResourceSelection();\r
- \r
- public StructuredResourceSelection getCurrentSelection() {\r
- return selection;\r
- }\r
-\r
- public void setCurrentSelection(StructuredResourceSelection s) {\r
- selection = s;\r
- }\r
-\r
- public StructuredResourceSelection getHighlightSelection() {\r
- return interactiveSelection;\r
- }\r
-\r
- protected void setHighlightSelection(StructuredResourceSelection s) {\r
- interactiveSelection = s;\r
- }\r
- \r
- private ArrayList<ISelectionChangedListener> selectionChangedListeners = new ArrayList<ISelectionChangedListener>();\r
-\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)\r
- */\r
- public void addSelectionChangedListener(ISelectionChangedListener listener) {\r
- selectionChangedListeners.add(listener);\r
-\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()\r
- */\r
- public ISelection getSelection() {\r
- return selection;\r
- }\r
-\r
- \r
- \r
- public static StructuredResourceSelection transformSelection(ISelection sel) {\r
- if (sel instanceof StructuredResourceSelection)\r
- return (StructuredResourceSelection)sel;\r
- StructuredResourceSelection res = new StructuredResourceSelection();\r
- Resource resources[] = ResourceAdaptionUtils.toResources(sel);\r
- for (Resource r : resources)\r
- res.add(r);\r
- return res;\r
- }\r
- \r
-\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)\r
- */\r
- public void removeSelectionChangedListener(ISelectionChangedListener listener) {\r
- selectionChangedListeners.remove(listener);\r
-\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)\r
- */\r
- public void setSelection(ISelection selection) {\r
- // System.out.println();\r
- StructuredResourceSelection s = filterSelection(selection);\r
- if (this.selection.equals(s))\r
- return;\r
- this.selection = s;\r
- adapter.setChanged(true);\r
- setEditorSelection();\r
-\r
- }\r
-\r
- /**\r
- * Filters selection given with setSelection(ISelection selection) This\r
- * allows impemented editors to modify selection before it's applied into\r
- * this editor\r
- * \r
- * @param s\r
- * @return the filtered selection\r
- */\r
- protected StructuredResourceSelection filterSelection(ISelection s) {\r
- if (!(selection instanceof StructuredResourceSelection))\r
- return new StructuredResourceSelection();\r
- return (StructuredResourceSelection) selection;\r
- }\r
-\r
- /**\r
- * Updates visual part of selection event. Use getCurrentSelection() to get\r
- * the selection\r
- */\r
- public abstract void setEditorSelection();\r
-\r
- /**\r
- * Updates visual part of selection event. Use getInteractiveSelection() to\r
- * get the selection\r
- */\r
- protected abstract void setEditorHighlightSelection();\r
-\r
- /**\r
- * Editor's internal selection update<br>\r
- * Sends events to other editors and views about changed selection\r
- * \r
- * @param selection\r
- * @return\r
- */\r
- public boolean updateSelection(StructuredResourceSelection s) {\r
- if (this.selection.equals(s))\r
- return false;\r
-\r
- this.selection = s;\r
- adapter.setChanged(true);\r
- fireSelectionChangedEvent();\r
- setEditorSelection();\r
- return true;\r
- }\r
-\r
- protected boolean updateHighlightSelection(StructuredResourceSelection s) {\r
- if (interactiveSelection.equals(s))\r
- return false;\r
- this.interactiveSelection = s;\r
- adapter.setChanged(true);\r
- setEditorHighlightSelection();\r
- return true;\r
- }\r
-\r
- /**\r
- * Fires selection changed events.\r
- */\r
- protected void fireSelectionChangedEvent() {\r
- SelectionChangedEvent e = new SelectionChangedEvent(this, this.selection);\r
- for (ISelectionChangedListener l : selectionChangedListeners)\r
- l.selectionChanged(e);\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import java.awt.event.MouseEvent;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import javax.vecmath.Tuple3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.jface.action.IMenuListener;\r
-import org.eclipse.jface.action.IMenuManager;\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.eclipse.jface.action.MenuManager;\r
-import org.eclipse.jface.action.Separator;\r
-import org.eclipse.jface.dialogs.MessageDialog;\r
-import org.eclipse.jface.viewers.ISelection;\r
-import org.eclipse.jface.viewers.ISelectionChangedListener;\r
-import org.eclipse.jface.viewers.SelectionChangedEvent;\r
-import org.eclipse.swt.events.PaintEvent;\r
-import org.eclipse.swt.events.PaintListener;\r
-import org.eclipse.swt.graphics.Point;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Menu;\r
-import org.eclipse.ui.IActionBars;\r
-import org.eclipse.ui.ISharedImages;\r
-import org.eclipse.ui.IWorkbenchActionConstants;\r
-import org.eclipse.ui.IWorkbenchPart;\r
-import org.eclipse.ui.PlatformUI;\r
-import org.eclipse.ui.internal.WorkbenchWindow;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
-import org.simantics.db.events.GraphChangeEvent;\r
-import org.simantics.db.management.ISessionContext;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.proconf.g3d.Activator;\r
-import org.simantics.proconf.g3d.actions.CameraAction;\r
-import org.simantics.proconf.g3d.actions.ContextAction;\r
-import org.simantics.proconf.g3d.actions.InteractiveAction;\r
-import org.simantics.proconf.g3d.base.SelectionAdapter.SelectionType;\r
-import org.simantics.proconf.g3d.common.JmeComposite;\r
-import org.simantics.proconf.g3d.common.JmeSinglePassRenderingComponent;\r
-import org.simantics.proconf.g3d.common.OrbitalCamera;\r
-import org.simantics.proconf.g3d.dialogs.JMEDialog;\r
-import org.simantics.proconf.g3d.dnd.ShapeDropTarget;\r
-import org.simantics.proconf.g3d.gizmo.Gizmo;\r
-import org.simantics.proconf.g3d.input.InputProvider;\r
-import org.simantics.proconf.g3d.input.SWTInputProvider;\r
-import org.simantics.proconf.g3d.scenegraph.IGeometryNode;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.tools.ScenegraphLockTraverser;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-import org.simantics.utils.ui.jface.MenuTools;\r
-\r
-import com.jme.math.Ray;\r
-import com.jme.math.Vector2f;\r
-import com.jme.math.Vector3f;\r
-import com.jme.renderer.ColorRGBA;\r
-\r
-\r
-public abstract class ThreeDimensionalEditorBase implements Runnable {\r
-\r
- private Resource inputResource;\r
- \r
- private List<EditorContribution> editorContributions = new ArrayList<EditorContribution>();\r
- \r
- private EditorContribution currentEditorContribution;\r
- \r
- protected List<ContextAction> actions = new ArrayList<ContextAction>();\r
- \r
- private List<Action> contributionSelectionActions = new ArrayList<Action>();\r
- \r
- protected Composite parent;\r
- \r
- protected ISessionContext sessionContext;\r
- \r
- protected Session session;\r
- \r
- protected ScenegraphAdapter adapter;\r
- \r
- protected SelectionAdapter selectionAdapter;\r
- \r
- protected Action refreshAction;\r
- \r
- protected Action configureJMEAction;\r
- \r
- private Action lockScenegraphAction;\r
-\r
- protected Menu contextMenu;\r
-\r
- private JmeComposite renderingComposite = null; \r
-\r
- protected OrbitalCamera camera = new OrbitalCamera();\r
-\r
- protected boolean viewChanged = true;\r
-\r
- private InteractiveAction currentAction = null;\r
- \r
- private Gizmo currentGizmo = null;\r
- \r
- private InteractiveAction cameraAction = null;\r
- \r
- private JmeRenderingComponent component = null;\r
- \r
- protected InputProvider input = null;\r
- \r
- protected ShapeDropTarget dropTarget;\r
-\r
-// protected IEditorActionBarContributor actionBarContributor;\r
- protected IActionBars actionBars;\r
- protected IToolBarManager toolBarManager;\r
- protected IMenuManager menuManager;\r
- \r
- public ThreeDimensionalEditorBase(ISessionContext session) {\r
- this.sessionContext = session;\r
- this.session = session.getSession();\r
- component = new JmeSinglePassRenderingComponent();\r
- }\r
-\r
- public ThreeDimensionalEditorBase(ISessionContext session, JmeRenderingComponent component) {\r
- this.sessionContext = session;\r
- this.session = session.getSession();\r
- this.component = component;\r
- }\r
- \r
- protected void setRenderingComponent(JmeRenderingComponent component) {\r
- assert(renderingComposite == null); // ensure that this is called before initialization\r
- this.component = component;\r
- }\r
- \r
-// public void setActionBarContributor(IEditorActionBarContributor contributor) {\r
-// actionBarContributor = contributor;\r
-// }\r
- \r
- public void setActionBars(IActionBars actionBars) {\r
- this.actionBars = actionBars;\r
- this.menuManager = actionBars.getMenuManager();\r
- this.toolBarManager = actionBars.getToolBarManager();\r
- }\r
- \r
- \r
- \r
- \r
- public ISessionContext getSessionContext() {\r
- return sessionContext;\r
- }\r
- \r
- public Session getSession() {\r
- return session;\r
- }\r
- \r
- /**\r
- * Creates basic UI for ThreeDimenionalEditors.\r
- * Note : inputResource has not been set at this point.\r
- * \r
- * @param graph\r
- * @param parent\r
- */\r
- public void createControl(Graph graph, Composite parent) {\r
- this.parent = parent;\r
- renderingComposite = new JmeComposite(parent,component);\r
- // add listeners to force repaint on size changes\r
- renderingComposite.getCanvas().addPaintListener(new PaintListener() {\r
- public void paintControl(PaintEvent e) {\r
- viewChanged = true; \r
- }\r
- });\r
-\r
- \r
- input = new SWTInputProvider();\r
- \r
- renderingComposite.initGL();\r
- camera.setCamera(component.getCamera());\r
- camera.updateCamera(); \r
- makeActions(graph);\r
- hookContextMenu();\r
-\r
- // provide selection events for properies view\r
- this.adapter = createScenegraphAdapter();\r
- this.selectionAdapter = createSelectionAdapter();\r
- \r
- this.selectionAdapter.addSelectionChangedListener(new ISelectionChangedListener() {\r
- public void selectionChanged(SelectionChangedEvent event) {\r
- setCurrentAction(getDefaultAction()); \r
- }\r
- });\r
- hookDragAndDrop(); \r
- hookInput();\r
- VisualizationScheduler.getInstance().addVisualization(this);\r
- \r
- if (editorContributions.size() > 0) {\r
- // setActiveEditorContribution(editorContributions.get(0));\r
- // } else if (editorContributions.size() > 1) {\r
- // create actions for selecting contribution\r
- for (EditorContribution ec : editorContributions) {\r
- final EditorContribution e = ec;\r
- Action a = new Action(e.getName(),Action.AS_RADIO_BUTTON) {\r
- @Override\r
- public void run() {\r
- \r
- setActiveEditorContribution(e);\r
- }\r
- };\r
- contributionSelectionActions.add(a);\r
- \r
- }\r
- }\r
- \r
- }\r
- \r
- public void addEditorContribution(EditorContribution e) {\r
- if (parent != null)\r
- throw new RuntimeException("Editor contributions must be added before editor is created.");\r
- editorContributions.add(e);\r
- }\r
- \r
- private void initializeEditorContributions(Graph graph) {\r
- for (EditorContribution e : editorContributions) {\r
- e.initialize(graph);\r
- }\r
- if (editorContributions.size() > 0)\r
- parent.getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- setActiveEditorContribution(editorContributions.get(0));\r
- }\r
- }); \r
- }\r
- \r
- \r
- private void hookInput() {\r
- renderingComposite.getCanvas().addKeyListener((SWTInputProvider) input);\r
- renderingComposite.getCanvas().addMouseListener((SWTInputProvider) input);\r
- renderingComposite.getCanvas().addMouseMoveListener((SWTInputProvider) input);\r
- renderingComposite.getCanvas().addMouseTrackListener((SWTInputProvider) input);\r
- renderingComposite.getCanvas().addFocusListener((SWTInputProvider) input);\r
- }\r
- \r
- protected abstract ScenegraphAdapter createScenegraphAdapter();\r
- protected abstract SelectionAdapter createSelectionAdapter();\r
-\r
- \r
- public JmeComposite getRenderingComposite() {\r
- return renderingComposite;\r
- }\r
- \r
- public JmeRenderingComponent getRenderingComponent() {\r
- return component;\r
- }\r
-\r
- public ScenegraphAdapter getScenegraphAdapter() {\r
- return adapter;\r
- }\r
- \r
- public SelectionAdapter getSelectionAdapter() {\r
- return selectionAdapter;\r
- }\r
-\r
- public OrbitalCamera getCamera() {\r
- return camera;\r
- }\r
- \r
- public void setViewChanged(boolean b) {\r
- viewChanged = b;\r
- }\r
-\r
- protected void hookContextMenu() {\r
- MenuManager menuMgr = new MenuManager("#PopupMenu");\r
- menuMgr.setRemoveAllWhenShown(true);\r
- menuMgr.addMenuListener(new IMenuListener() {\r
- public void menuAboutToShow(IMenuManager manager) {\r
- final IMenuManager m = manager;\r
- GraphRequestAdapter r = new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- ThreeDimensionalEditorBase.this.fillContextMenu(g,m);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- };\r
- \r
- session.syncRead(r);\r
- \r
- }\r
- });\r
-\r
- contextMenu = menuMgr.createContextMenu(renderingComposite);\r
- }\r
-\r
- \r
-\r
- protected void fillContextMenu(Graph graph,IMenuManager manager) {\r
- manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));\r
- \r
- List<Resource> selected = selectionAdapter.getSelectedResources();\r
- for (ContextAction action : actions) {\r
- if(action.usable(graph,selected)) {\r
- manager.add(action);\r
- }\r
- }\r
- if (currentEditorContribution != null) {\r
- currentEditorContribution.fillContextMenu(graph, manager, selectionAdapter.getCurrentSelection());\r
- for (ContextAction action : currentEditorContribution.getActions()) {\r
- if(action.usable(graph,selected)) {\r
- manager.add(action);\r
- }\r
- }\r
- }\r
-\r
- }\r
-\r
- protected void fillLocalToolBar() {\r
-\r
- if (currentEditorContribution != null)\r
- currentEditorContribution.fillLocalToolBar(toolBarManager);\r
- }\r
- \r
- protected void fillLocalPullDown() {\r
- for (Action a : contributionSelectionActions) {\r
- IMenuManager menu = MenuTools.getOrCreate(getMenuID(),"View", menuManager);\r
- menu.add(a);\r
- }\r
- MenuTools.getOrCreate(getMenuID(),"Advanced", menuManager).add(refreshAction);\r
- if (configureJMEAction != null) {\r
- MenuTools.getOrCreate(getMenuID(),"Advanced", menuManager).add(configureJMEAction);\r
- }\r
-\r
- MenuTools.getOrCreate(getMenuID(),"Advanced", menuManager).add(lockScenegraphAction);\r
- if (currentEditorContribution != null)\r
- currentEditorContribution.fillLocalPullDown(menuManager);\r
- }\r
- \r
- public String getMenuID() {\r
- return Long.toString(getInputResource().getResourceId());\r
- }\r
-\r
- protected void makeActions(Graph graph) {\r
- \r
- refreshAction = new Action() {\r
-\r
- public void run() {\r
- GraphRequestAdapter r = new GraphRequestAdapter() {\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
-// Stack<IGraphicsNode> stack = new Stack<IGraphicsNode>();\r
-// stack.push(adapter.getNode(adapter.getRootResource()));\r
-// while(!stack.isEmpty()) {\r
-// IGraphicsNode node = stack.pop();\r
-// stack.addAll(node.getChildren());\r
-// if (node instanceof IGeometryNode) {\r
-// ((IGeometryNode)node).updateGeometry(g);\r
-// }\r
-// }\r
- for (IGraphicsNode node : adapter.getNodes())\r
- if (node instanceof IGeometryNode)\r
- ((IGeometryNode)node).updateGeometry(g);\r
- viewChanged = true;\r
- return GraphRequestStatus.transactionComplete();\r
- };\r
- };\r
- session.asyncRead(r);\r
- \r
- }\r
- };\r
- refreshAction.setText("Refresh");\r
- refreshAction.setToolTipText("Refreshes the visualization");\r
- refreshAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(\r
- ISharedImages.IMG_TOOL_UP));\r
- if (getRenderingComponent() instanceof JmeSinglePassRenderingComponent) {\r
- configureJMEAction = new Action() {\r
- public void run() {\r
- JmeSinglePassRenderingComponent c = (JmeSinglePassRenderingComponent)getRenderingComponent();\r
- JMEDialog dialog = new JMEDialog(ThreeDimensionalEditorBase.this.parent.getShell());\r
- c.getDisplaySystem().setCurrent();\r
- dialog.setBounds(c.isShowBounds());\r
- dialog.setNormals(c.isShowNormals());\r
- dialog.setWireframe(c.isShowWireframe());\r
- ColorRGBA col = c.getDisplaySystem().getRenderer().getBackgroundColor();\r
- dialog.setFloatColor(new float[]{col.r,col.g,col.b});\r
- if (dialog.open() == JMEDialog.CANCEL)\r
- return;\r
- c.setShowBounds(dialog.isBounds());\r
- c.setShowNormals(dialog.isNormals());\r
- c.setShowWireframe(dialog.isWireframe());\r
- if (dialog.getFloatColor() != null) {\r
- c.getDisplaySystem().setCurrent();\r
- c.getDisplaySystem().getRenderer().setBackgroundColor(new ColorRGBA(dialog.getFloatColor()[0],dialog.getFloatColor()[1],dialog.getFloatColor()[2],0.f));\r
- }\r
- }\r
- };\r
- configureJMEAction.setText("Configure JME");\r
- configureJMEAction.setImageDescriptor(Activator.imageDescriptorFromPlugin("fi.vtt.proconf.ode", "icons/silk/wrench.png"));\r
- }\r
- \r
- lockScenegraphAction = new Action("Lock scenegraph",Action.AS_CHECK_BOX) {\r
- public void run() {\r
- new ScenegraphLockTraverser(adapter.getRoot(),this.isChecked());\r
- }\r
- };\r
- \r
- cameraAction = new CameraAction(this); \r
- currentAction = cameraAction;\r
- \r
- \r
- }\r
- \r
- public InteractiveAction getDefaultAction() {\r
- return cameraAction;\r
- }\r
- \r
- public void createPickRay(Vector3d o, Vector3d d) {\r
- Ray r = createPickRay();\r
- o.x = r.origin.x;\r
- o.y = r.origin.y;\r
- o.z = r.origin.z;\r
- d.x = r.direction.x;\r
- d.y = r.direction.y;\r
- d.z = r.direction.z;\r
- d.normalize();\r
- }\r
- \r
- public Ray createPickRay() {\r
- Vector2f screenPos = new Vector2f();\r
- screenPos.set(input.mouseX(),renderingComposite.getBounds().height - input.mouseY());\r
- \r
- \r
- Ray mouseRay;\r
- if (component.getCamera().isParallelProjection()) {\r
- Vector3f worldCoords = renderingComposite.getDisplaySystem().getWorldCoordinates(screenPos, 0.0f);\r
- mouseRay = new Ray(worldCoords,\r
- component.getCamera().getDirection());\r
- } else {\r
- Vector3f worldCoords = renderingComposite.getDisplaySystem().getWorldCoordinates(screenPos, 1.0f);\r
- mouseRay = new Ray(component.getCamera().getLocation(), worldCoords\r
- .subtractLocal(component.getCamera().getLocation()));\r
- }\r
- return mouseRay;\r
- }\r
- \r
- public Vector2f getScreenCoord(Tuple3d worldCoord) {\r
- Vector3f v = renderingComposite.getDisplaySystem().getScreenCoordinates(VecmathJmeTools.get(worldCoord));\r
- return new Vector2f(v.x,v.y);\r
- }\r
- \r
- \r
- public InputProvider getInputProvider() {\r
- return input;\r
- }\r
-\r
- /**\r
- * Changes current action \r
- * \r
- * @param type\r
- */\r
- public void setCurrentAction(InteractiveAction action) {\r
- if (currentAction == action)\r
- return;\r
- if (toolBarManager != null) {\r
- toolBarManager.removeAll();\r
- fillLocalToolBar();\r
- }\r
- if (currentAction != null)\r
- currentAction.deactivate();\r
- currentAction = action;\r
- if (currentAction != null) {\r
- currentAction.activate();\r
- if (toolBarManager != null) {\r
- currentAction.fillToolBar(toolBarManager);\r
- }\r
- }\r
- \r
- updateBars();\r
- }\r
- \r
- public InteractiveAction getCurrentAction() {\r
- return currentAction;\r
- }\r
- \r
- public void setActiveEditorContribution(EditorContribution contribution) {\r
- if (currentEditorContribution == contribution)\r
- return;\r
- if (currentAction != getDefaultAction())\r
- return;\r
- if (currentEditorContribution != null)\r
- currentEditorContribution.disposeControl();\r
- currentEditorContribution = contribution;\r
- int index = editorContributions.indexOf(contribution);\r
- for (int i = 0; i < contributionSelectionActions.size(); i++) {\r
- if (i != index)\r
- contributionSelectionActions.get(i).setChecked(false);\r
- else\r
- contributionSelectionActions.get(i).setChecked(true);\r
- }\r
- if (currentEditorContribution != null)\r
- currentEditorContribution.createControl(parent);\r
- \r
- actionBars.clearGlobalActionHandlers();\r
- \r
- parent.layout(true, true);\r
- if (toolBarManager != null) {\r
- toolBarManager.removeAll();\r
- fillLocalToolBar();\r
- }\r
- if (menuManager != null) { \r
- menuManager.removeAll();\r
- fillLocalPullDown();\r
- }\r
- \r
- updateBars();\r
- }\r
- \r
- protected void updateBars() {\r
- // TODO : actionBars.updateActionBars does not update toolbar, updating toolBar directly layouts code \r
- // generated widgets top of contributed (extension) widgets. Only way to achieve proper update\r
- // is to use WorkbenchWindow.getCoolBarManager.update(true)\r
- actionBars.updateActionBars();\r
-// if (toolBarManager != null) {\r
-// toolBarManager.update(true);\r
-// }\r
- WorkbenchWindow w = (WorkbenchWindow)PlatformUI.getWorkbench().getActiveWorkbenchWindow();\r
- w.getCoolBarManager().update(true);\r
- }\r
- \r
- public void setGizmo(Gizmo gizmo) {\r
- if (currentGizmo != null) {\r
- currentGizmo.getNode().removeFromParent();\r
- }\r
- currentGizmo = gizmo;\r
- selectionAdapter.setCurrentGizmo(gizmo);\r
- viewChanged = true;\r
- }\r
- \r
-// public void setInfoText(String text) {\r
-// if (useInfoComposite) {\r
-// infoText.setText(text);\r
-// }\r
-// }\r
-\r
- public void showMessage(String message) {\r
- MessageDialog.openInformation(parent.getShell(), "Shape Editor", //$NON-NLS-1$\r
- message);\r
- }\r
-\r
-\r
- /**\r
- * Passing the focus request to the viewer's control.\r
- */\r
- public void setFocus() {\r
- renderingComposite.getCanvas().setFocus();\r
- }\r
-\r
- public void dispose() {\r
- //System.out.println("ThreeDimensionalEditorBase.dispose()");\r
- VisualizationScheduler.getInstance().removeVisualization(this);\r
-\r
- if (currentAction != null)\r
- currentAction.deactivate();\r
-\r
- for (EditorContribution e : editorContributions)\r
- e.dispose();\r
- \r
- renderingComposite.dispose();\r
-\r
- // copy of the set is needed to avoid ConcurrentModificationException\r
- adapter.dispose();\r
- component.dispose();\r
- }\r
-\r
- public final void reload(Graph g, Resource res) {\r
- inputResource = res;\r
- reloadFrom(EntityFactory.create(g, res));\r
- // at this point we can initialize editor contributions, which may require inputResource\r
- initializeEditorContributions(g);\r
- }\r
-\r
- public Resource getInputResource() {\r
- return inputResource;\r
- }\r
- \r
- public void update(GraphChangeEvent event) {\r
-// System.out.println("Transaction " + this + " : " + event.getTransactionId() + " Arg1: " + event.getArg1()\r
-// + " arg2: " + event.getArg2() + " sender: " + event.getSender() + " source: " + event.getSource());\r
- \r
-// if (event.added.size() > 0) {\r
-// System.out.println("Added:");\r
-// for (Triplet t : event.added)\r
-// System.out.println(t);\r
-// }\r
-// if (event.changed.size() > 0) {\r
-// System.out.println("Changed:");\r
-// for (Triplet t : event.changed)\r
-// System.out.println(t);\r
-// }\r
-// if (event.removed.size() > 0) {\r
-// System.out.println("Removed:");\r
-// for (Triplet t : event.removed)\r
-// System.out.println(t);\r
-// }\r
-\r
- }\r
-\r
- \r
-\r
- /**\r
- * Loads the initial scene: all further updates to the view are done by\r
- * listening changes in the shapes and int the shape group\r
- * \r
- * @param resource\r
- */\r
- protected abstract void reloadFrom(IEntity thing);\r
-\r
-\r
- protected void viewUpdated() {\r
-\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see java.lang.Runnable#run()\r
- */\r
- public void run() {\r
- if (currentEditorContribution != null)\r
- currentEditorContribution.run();\r
- if (parent.isDisposed() || !parent.isVisible())\r
- return;\r
- //renderingComposite.getDisplaySystem().setCurrent();\r
- input.update();\r
- if (input.mouseClicked()) {\r
- int downMask = MouseEvent.CTRL_DOWN_MASK;\r
-\r
- if ((input.clickModifiers() & downMask) > 0) {\r
- selectionAdapter.setSelectionType(SelectionType.MODIFY);\r
- } else {\r
- selectionAdapter.setSelectionType(SelectionType.SET);\r
- }\r
- }\r
- if (input.mouseMoved()) {\r
- Ray mouseRay = createPickRay();\r
- selectionAdapter.updateHighlights(mouseRay);\r
- }\r
- if (currentAction == cameraAction && input.mouseClicked()) {\r
- selectionAdapter.pickHighlighted();\r
- }\r
- if (currentAction == cameraAction && input.mousePressed()\r
- && (input.pressModifiers() & MouseEvent.BUTTON3_MASK) > 0) {\r
- Point p = renderingComposite.toDisplay(input.mouseX(), input\r
- .mouseY());\r
- contextMenu.setLocation(p.x, p.y);\r
- contextMenu.setVisible(true);\r
- }\r
-\r
- if (currentAction != null)\r
- try {\r
- currentAction.update();\r
- } catch (Exception e) {\r
- ErrorLogger.defaultLogError("Action error!", e);\r
- setCurrentAction(getDefaultAction());\r
- }\r
-\r
- if (component.update())\r
- viewChanged = true;\r
- \r
- if (!geometryUpdateRequestAdapter.isRunning() && adapter.needsUpdateGeometry()) {\r
- session.asyncRead(geometryUpdateRequestAdapter); \r
- }\r
- \r
- viewChanged |= adapter.isChanged();\r
- if (viewChanged) {\r
- viewChanged = false;\r
- adapter.setChanged(false);\r
- camera.updateCamera();\r
- viewUpdated();\r
- component.render();\r
- }\r
- }\r
- // TODO : there is some sort of synchronization bug in rendering:\r
- // part of the rendered objects are rendered with different camera transformation than others.\r
- // re-rendering the scene hides the worst problems.\r
- // Using shadows is the reason: shadowed objects are rendered with different transformation than non-shadowed.\r
- //private boolean lastChanged = false;\r
- \r
- private GeometryUpdateRequestAdapter geometryUpdateRequestAdapter = new GeometryUpdateRequestAdapter();\r
- \r
- private class GeometryUpdateRequestAdapter extends GraphRequestAdapter {\r
- private boolean running;\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- running = true;\r
- adapter.updateGeometry(g);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- @Override\r
- public void requestCompleted(GraphRequestStatus status) {\r
- running = false;\r
- adapter.setChanged(true);\r
- }\r
- \r
- public boolean isRunning() {\r
- return running;\r
- }\r
- }\r
-\r
- \r
- \r
- protected void hookDragAndDrop() {\r
- dropTarget = new ShapeDropTarget(this);\r
- }\r
-\r
- /**\r
- * Receives selection changes\r
- * \r
- * @param part\r
- * @param selection\r
- */\r
- protected abstract void pageSelectionChanged(IWorkbenchPart part, ISelection selection);\r
-\r
- /**\r
- * EditorPart or ViewPart uses this method to forward getAdapter(Class)\r
- * @see org.eclipse.ui.part.WorkbenchPart.getAdapter(Class adapter)\r
- * @param adapter\r
- * @return\r
- */\r
- public Object getAdapter(Class adapter) {\r
- return null;\r
- }\r
-\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import org.eclipse.jface.action.IStatusLineManager;\r
-import org.eclipse.jface.viewers.ISelection;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Display;\r
-import org.eclipse.ui.IActionBars;\r
-import org.eclipse.ui.ISelectionListener;\r
-import org.eclipse.ui.IWorkbenchPart;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Session;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.events.GraphChangeEvent;\r
-import org.simantics.db.management.ISessionContext;\r
-import org.simantics.proconf.ui.workbench.ResourceEditorPart;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-\r
-public abstract class ThreeDimensionalEditorPart extends ResourceEditorPart implements ThreeDimensionalEditorProvider{\r
- \r
- protected Composite parent;\r
- \r
- protected ThreeDimensionalEditorBase editor;\r
-\r
- protected ISelectionListener pageSelectionListener;\r
-\r
- protected abstract ThreeDimensionalEditorBase createEditor(ISessionContext session);\r
- \r
- /**\r
- * This is a callback that will allow us to create the viewer and it.\r
- */\r
- @Override\r
- public void createPartControl(Composite p) {\r
- this.parent = p;\r
- try {\r
- editor = createEditor(getSessionContext());\r
- \r
- // add partlistener that loads the scene-graph when the view has been created\r
- this.getEditorSite().getPage().addPartListener(new EditorLoader() {\r
-\r
- public IWorkbenchPart getWorkbechPart() {\r
- return ThreeDimensionalEditorPart.this.getEditorSite().getPart();\r
- }\r
- \r
- public void load() {\r
- //System.out.println("ThreeDimensionalEditorPart.reload()");\r
- Session ses = ThreeDimensionalEditorPart.this.getSession();\r
- GraphRequestAdapter r = new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g)\r
- throws Exception {\r
- reload(g);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- };\r
- ses.asyncRead(r);\r
- }\r
- });\r
-\r
- IActionBars actionBar = getEditorSite().getActionBars();\r
-// editor.setActionBarContributor(getEditorSite().getActionBarContributor());\r
- editor.setActionBars(actionBar);\r
- getSession().syncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- editor.createControl(g,parent);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- contributeStatusBar(actionBar.getStatusLineManager());\r
- hookPageSelection(); \r
- getSite().setSelectionProvider(editor.selectionAdapter);\r
- \r
-\r
-\r
- } catch (Exception e) {\r
- Display d = getSite().getShell().getDisplay();\r
- d.asyncExec(new Runnable() {\r
- public void run() {\r
- getSite().getPage().closeEditor(ThreeDimensionalEditorPart.this,false);\r
- }\r
- });\r
-\r
- ErrorLogger logger = ErrorLogger.getDefault();\r
- logger.logError("Shape editor failed to open, see exception for details", e);\r
- }\r
-\r
- }\r
- \r
-\r
- protected void contributeStatusBar(IStatusLineManager manager) {\r
- }\r
- \r
- \r
- @Override\r
- public void reload(Graph g) {\r
- Resource inputResource = getInputResource();\r
- if (inputResource != null) {\r
- editor.reload(g,inputResource);\r
- } else {\r
- \r
- Display d = getSite().getShell().getDisplay();\r
- d.asyncExec(new Runnable() {\r
- public void run() {\r
- editor.showMessage("Failed to load model.");\r
- getSite().getPage().closeEditor(ThreeDimensionalEditorPart.this,false);\r
- }\r
- });\r
- }\r
- }\r
- \r
- @Override\r
- public void update(GraphChangeEvent e) {\r
- editor.update(e);\r
- }\r
- \r
- @Override\r
- public void setFocus() {\r
- editor.setFocus();\r
- }\r
- \r
- /**\r
- * Hooks selection listening\r
- */\r
- private void hookPageSelection() {\r
- pageSelectionListener = new ISelectionListener() {\r
- public void selectionChanged(IWorkbenchPart part, ISelection selection) {\r
- if (part == ThreeDimensionalEditorPart.this) {\r
- return;\r
- }\r
- pageSelectionChanged(part, selection);\r
- }\r
- };\r
- getSite().getPage().addPostSelectionListener(pageSelectionListener);\r
- getSite().getPage().addSelectionListener(pageSelectionListener);\r
- ISelection sel = getSite().getPage().getSelection();\r
- IWorkbenchPart wb = getSite().getPage().getActivePart();\r
- pageSelectionChanged(wb, sel);\r
- }\r
- \r
- /**\r
- * Receives selection changes\r
- * \r
- * @param part\r
- * @param selection\r
- */\r
- protected void pageSelectionChanged(IWorkbenchPart part, ISelection selection) {\r
- editor.pageSelectionChanged(part, selection);\r
- }\r
- \r
- public void dispose() {\r
- if (pageSelectionListener != null) {\r
- getSite().getPage().removePostSelectionListener(pageSelectionListener);\r
- getSite().getPage().removeSelectionListener(pageSelectionListener);\r
- }\r
- editor.dispose();\r
- super.dispose();\r
- }\r
- \r
- public ThreeDimensionalEditorBase getEditor() {\r
- return editor;\r
- }\r
- \r
- @Override\r
- public Object getAdapter(Class adapter) {\r
- Object o = super.getAdapter(adapter);\r
- if (o == null) {\r
- o = editor.getAdapter(adapter);\r
- }\r
- return o;\r
- }\r
-\r
-\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-/**\r
- * Interface which selectionProviders containing ThreeDimensionalEditorPart\r
- * must implement. \r
- * \r
- * This enables usage of ThreeDimensionalEditorPart in views, editors, dialogs, and so on.\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public interface ThreeDimensionalEditorProvider {\r
-\r
- public ThreeDimensionalEditorBase getEditor();\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import java.util.Collection;\r
-import java.util.HashMap;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Quat4d;\r
-import javax.vecmath.Tuple3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.proconf.g3d.Resources;\r
-import org.simantics.proconf.g3d.stubs.Orientation;\r
-import org.simantics.proconf.g3d.stubs.Position;\r
-\r
-public class TransformationTools {\r
- \r
- private static boolean DEBUG = false;\r
- \r
- private Resource childRelation;\r
- private Resource parentRelation;\r
- \r
- public TransformationTools(Resource childRelation, Resource parentRelation) {\r
- this.childRelation = childRelation;\r
- this.parentRelation = parentRelation;\r
- }\r
- \r
- public IEntity getParent(IEntity node) {\r
- return node.getAtMostOneRelatedObject(parentRelation);\r
- }\r
- \r
- public Point3d getLocalFromWorld(IEntity node, Point3d worldCoord) {\r
- IEntity parent = getParent(node);\r
- if (parent == null) {// this is a rootnode ( has no transformation) \r
- return worldCoord;\r
- }\r
-\r
- Point3d local = getLocalFromWorld2(parent,worldCoord);\r
- return local;\r
- }\r
- \r
- \r
- private Point3d getLocalFromWorld2(IEntity node, Point3d worldCoord) {\r
- IEntity parent = getParent(node);\r
- if (parent == null) {// this is a root node ( has no transformation) \r
- return worldCoord;\r
- }\r
-\r
- Point3d local = getLocalFromWorld2(parent,worldCoord);\r
- if (node.hasStatement(Resources.g3dResource.HasLocalPosition))\r
- local.sub(G3DTools.getPoint(node.getSingleRelatedObject(Resources.g3dResource.HasLocalPosition)));\r
- if (node.hasStatement(Resources.g3dResource.HasLocalOrientation)) {\r
- Quat4d q = new Quat4d();\r
- q.set(G3DTools.getOrientation(node.getSingleRelatedObject(Resources.g3dResource.HasLocalOrientation)));\r
- q.inverse();\r
- MathTools.rotate(q, local, local);\r
- }\r
- return local;\r
- }\r
- \r
- public Point3d getWorldFromLocal(IEntity node,Point3d localCoord) {\r
- IEntity parent = getParent(node);\r
- if (parent == null) // this is a rootnode ( has no transformation)\r
- return localCoord;\r
- return getWorldFromLocal2(parent, localCoord);\r
- }\r
- \r
- private Point3d getWorldFromLocal2(IEntity node,Point3d localCoord) {\r
- \r
- if (node.hasStatement(Resources.g3dResource.HasLocalOrientation)) {\r
- Quat4d q = new Quat4d();\r
- q.set(G3DTools.getOrientation(node.getSingleRelatedObject(Resources.g3dResource.HasLocalOrientation)));\r
- MathTools.rotate(q, localCoord, localCoord);\r
- }\r
- if (node.hasStatement(Resources.g3dResource.HasLocalPosition))\r
- localCoord.add(G3DTools.getPoint(node.getSingleRelatedObject(Resources.g3dResource.HasLocalPosition)));\r
- \r
- IEntity parent = getParent(node);\r
- if (parent == null) // this is a rootnode ( has no transformation)\r
- return localCoord;\r
- \r
- return getWorldFromLocal2(parent,localCoord);\r
- }\r
- \r
- \r
- public AxisAngle4d getLocalFromWorld(IEntity node, AxisAngle4d worldRot) {\r
- IEntity parent = getParent(node);\r
- if (parent == null) // this is a rootnode ( has no transformation)\r
- return worldRot;\r
-\r
- AxisAngle4d local = getLocalFromWorld2(parent,worldRot);\r
-\r
- return local;\r
- }\r
- \r
- private AxisAngle4d getLocalFromWorld2(IEntity node, AxisAngle4d worldRot) {\r
- IEntity parent = getParent(node);\r
- if (parent == null) // this is a rootnode ( has no transformation)\r
- return worldRot;\r
- AxisAngle4d local = getLocalFromWorld2(parent,worldRot);\r
- \r
- if (node.hasStatement(Resources.g3dResource.HasLocalOrientation)) {\r
- Quat4d q = new Quat4d();\r
- q.set(G3DTools.getOrientation(node.getSingleRelatedObject(Resources.g3dResource.HasLocalOrientation)));\r
- q.inverse();\r
- Quat4d q2 = new Quat4d();\r
- q2.set(local);\r
- q.mul(q2);\r
- local.set(q);\r
- }\r
-\r
- return local;\r
- }\r
- \r
- public AxisAngle4d getWorldFromLocal(IEntity node,AxisAngle4d localRot) {\r
- IEntity parent = getParent(node);\r
- if (parent == null)\r
- return localRot;\r
-\r
- return getWorldFromLocal2(parent,localRot);\r
- }\r
- \r
- private AxisAngle4d getWorldFromLocal2(IEntity node,AxisAngle4d localRot) {\r
- \r
- //System.out.print("wtl " + node.getResource() + " " + localCoord);\r
- if (node.hasStatement(Resources.g3dResource.HasLocalOrientation)) {\r
- Quat4d q = new Quat4d();\r
- q.set(G3DTools.getOrientation(node.getSingleRelatedObject(Resources.g3dResource.HasLocalOrientation)));\r
- Quat4d q2 = new Quat4d();\r
- q2.set(localRot);\r
- q.mul(q2);\r
- localRot.set(q);\r
- }\r
- \r
- IEntity parent = getParent(node);\r
- if (parent == null) // this is a rootnode ( has no transformation)\r
- return localRot;\r
- \r
- //System.out.println(" " + localCoord);\r
- return getWorldFromLocal2(parent,localRot);\r
- }\r
- \r
- public Point3d getLocalFromWorldR(IEntity node, Point3d worldCoord) {\r
- \r
- Point3d local = getLocalFromWorldR(null,worldCoord);\r
- if (node.hasStatement(Resources.g3dResource.HasLocalOrientation)) {\r
- Quat4d q = new Quat4d();\r
- q.set(G3DTools.getOrientation(node.getSingleRelatedObject(Resources.g3dResource.HasLocalOrientation)));\r
- q.inverse();\r
- MathTools.rotate(q, local, local);\r
- }\r
- \r
- IEntity parent = getParent(node);\r
- if (parent == null) // this is a rootnode ( has no transformation)\r
- return worldCoord;\r
- \r
- return local;\r
- }\r
- \r
- public Point3d getWorldFromLocalR(IEntity node,Point3d localCoord) {\r
- \r
- if (node.hasStatement(Resources.g3dResource.HasLocalOrientation)) {\r
- Quat4d q = new Quat4d();\r
- q.set(G3DTools.getOrientation(node.getSingleRelatedObject(Resources.g3dResource.HasLocalOrientation)));\r
- MathTools.rotate(q, localCoord, localCoord);\r
- } \r
- \r
- IEntity parent = getParent(node);\r
- if (parent == null) // this is a rootnode ( has no transformation)\r
- return localCoord;\r
- \r
- return getWorldFromLocalR(parent,localCoord);\r
- }\r
- \r
- /**\r
- * Updates transformations of all children of given node\r
- * @param node\r
- */\r
- public void propagateTransformChange(IEntity node) {\r
- Collection<IEntity> children = node.getRelatedObjects(childRelation);\r
- IEntity wp = node.getAtMostOneRelatedObject(Resources.g3dResource.HasWorldPosition);\r
- IEntity wr = node.getAtMostOneRelatedObject(Resources.g3dResource.HasWorldOrientation);\r
- Quat4d rot = new Quat4d();\r
- if (wr != null)\r
- rot.set(G3DTools.getOrientation(wr));\r
- else\r
- rot.w = 1.0;\r
- Point3d pos = new Point3d();\r
- if (wp != null)\r
- pos = G3DTools.getPoint(wp);\r
- if (DEBUG) {\r
- if (wr != null)\r
- System.out.println("propagate transform " + node.getResource() + " " + pos + " " + G3DTools.getOrientation(wr));\r
- else\r
- System.out.println("propagate transform " + node.getResource() + " " + pos);\r
- }\r
- for (IEntity n : children) {\r
- IEntity lPos = n.getAtMostOneRelatedObject(Resources.g3dResource.HasLocalPosition);\r
- IEntity lRot = n.getAtMostOneRelatedObject(Resources.g3dResource.HasLocalOrientation);\r
- if (DEBUG) System.out.print(n);\r
- if (lRot != null) {\r
- AxisAngle4d la = G3DTools.getOrientation(lRot);\r
- AxisAngle4d wa = getWorldFromLocal(n, la);\r
- IEntity wo = n.getSingleRelatedObject(Resources.g3dResource.HasWorldOrientation);\r
- G3DTools.setOrientation(wo,wa);\r
- storeProperty(wo.getResource(), wa);\r
- }\r
- if (lPos != null) {\r
- Point3d lp = G3DTools.getPoint(lPos);\r
- if (DEBUG) System.out.println(lp);\r
- MathTools.rotate(rot, lp, lp);\r
- lp.add(pos);\r
- IEntity nwp = n.getSingleRelatedObject(Resources.g3dResource.HasWorldPosition);\r
- G3DTools.setTuple3(nwp, lp);\r
- if (DEBUG) System.out.print(" " + lp);\r
- storeProperty(nwp.getResource(), lp);\r
- }\r
- if (DEBUG) System.out.println();\r
- propagateTransformChange(n);\r
- \r
- }\r
- }\r
- \r
- /**\r
- * Updates transformation of one child node without changing its local transformation.\r
- * @param parent\r
- * @param node\r
- */\r
- public void propagateLocalTransformChange(IEntity parent, IEntity node) {\r
- //Collection<IEntity> children = parent.getRelatedObjects(childRelation);\r
- IEntity parentWP = parent.getAtMostOneRelatedObject(Resources.g3dResource.HasWorldPosition);\r
- IEntity parentWR = parent.getAtMostOneRelatedObject(Resources.g3dResource.HasWorldOrientation);\r
- Quat4d parentWRot = new Quat4d();\r
- if (parentWR != null) {\r
- parentWRot.set(G3DTools.getOrientation(parentWR));\r
- \r
- } else\r
- parentWRot.w = 1.0;\r
- Point3d parentWPos = new Point3d();\r
- if (parentWP != null) {\r
- parentWPos = G3DTools.getPoint(parentWP);\r
- }\r
- if (DEBUG) {\r
- if (parentWR != null)\r
- System.out.println("propagate transform " + parent.getResource() + " " + parentWPos + " " + G3DTools.getOrientation(parentWR));\r
- else\r
- System.out.println("propagate transform " + parent.getResource() + " " + parentWPos);\r
- }\r
- //for (IEntity n : children) {\r
- // if (!n.equals(node))\r
- // continue;\r
- IEntity lPos = node.getAtMostOneRelatedObject(Resources.g3dResource.HasLocalPosition);\r
- IEntity lRot = node.getAtMostOneRelatedObject(Resources.g3dResource.HasLocalOrientation);\r
- if (DEBUG) System.out.print(node);\r
- if (lRot != null) {\r
- AxisAngle4d aa = G3DTools.getOrientation(lRot);\r
- storeProperty(lRot.getResource(), aa);\r
- AxisAngle4d la = getWorldFromLocal(node, aa);\r
- IEntity wo = node.getSingleRelatedObject(Resources.g3dResource.HasWorldOrientation);\r
- G3DTools.setOrientation(wo,la);\r
- storeProperty(wo.getResource(), la);\r
- }\r
- if (lPos != null) {\r
- Point3d lp = G3DTools.getPoint(lPos);\r
- storeProperty(lPos.getResource(), lp);\r
- MathTools.rotate(parentWRot, lp, lp);\r
- lp.add(parentWPos);\r
- IEntity nwp = node.getSingleRelatedObject(Resources.g3dResource.HasWorldPosition);\r
- G3DTools.setTuple3(nwp, lp);\r
- storeProperty(nwp.getResource(), lp);\r
- }\r
- if (DEBUG) System.out.println();\r
- propagateTransformChange(node);\r
- \r
- }\r
-// }\r
- \r
- public static void resetTransformation(IEntity shape) {\r
- Graph graph = shape.getGraph();\r
- if (shape.getAtMostOneRelatedObject(Resources.g3dResource.HasLocalPosition) == null) {\r
-\r
- // LocalPosition p = LocalPosition.createDefault(graph);\r
- Position p = Position.createDefault(graph);\r
- shape.addStatement(Resources.g3dResource.HasLocalPosition, p);\r
- // WorldPosition p2 = WorldPosition.createDefault(graph);\r
- Position p2 = Position.createDefault(graph);\r
- shape.addStatement(Resources.g3dResource.HasWorldPosition, p2);\r
- p.setX(new double[] { 0.0 });\r
- p.setY(new double[] { 0.0 });\r
- p.setZ(new double[] { 0.0 });\r
-\r
- p2.setX(new double[] { 0.0 });\r
- p2.setY(new double[] { 0.0 });\r
- p2.setZ(new double[] { 0.0 });\r
-\r
- } else {\r
- G3DTools.setTuple3(shape.getSingleRelatedObject(Resources.g3dResource.HasLocalPosition), 0.0, 0.0, 0.0);\r
- G3DTools.setTuple3(shape.getSingleRelatedObject(Resources.g3dResource.HasWorldPosition), 0.0, 0.0, 0.0);\r
- }\r
- if (shape.getAtMostOneRelatedObject(Resources.g3dResource.HasLocalOrientation) == null) {\r
-\r
- // LocalOrientation r = LocalOrientationFactory.create(graph);\r
- Orientation r = Orientation.createDefault(graph);\r
- shape.addStatement(Resources.g3dResource.HasLocalOrientation, r);\r
- // WorldOrientation r2 = WorldOrientationFactory.create(graph);\r
- Orientation r2 = Orientation.createDefault(graph);\r
- shape.addStatement(Resources.g3dResource.HasWorldOrientation, r2);\r
- r.setAngle(new double[] { 0.0 });\r
- r.setX(new double[] { 1.0 });\r
- r.setY(new double[] { 0.0 });\r
- r.setZ(new double[] { 0.0 });\r
- r2.setAngle(new double[] { 0.0 });\r
- r2.setX(new double[] { 1.0 });\r
- r2.setY(new double[] { 0.0 });\r
- r2.setZ(new double[] { 0.0 });\r
-\r
- } else {\r
- G3DTools.setOrientation(shape.getSingleRelatedObject(Resources.g3dResource.HasLocalOrientation),\r
- new AxisAngle4d(0.0, 1.0, 0.0, 0.0));\r
- G3DTools.setOrientation(shape.getSingleRelatedObject(Resources.g3dResource.HasWorldOrientation),\r
- new AxisAngle4d(0.0, 1.0, 0.0, 0.0));\r
- }\r
- }\r
- \r
- /**\r
- * Updates transformation of one child node without changing its world transformation.\r
- * @param parent\r
- * @param node\r
- */\r
- public void propagateWorldTransformChange(IEntity parent, IEntity node) {\r
- //Collection<IEntity> children = parent.getRelatedObjects(childRelation);\r
- IEntity parentWP = parent.getAtMostOneRelatedObject(Resources.g3dResource.HasWorldPosition);\r
- IEntity parentWR = parent.getAtMostOneRelatedObject(Resources.g3dResource.HasWorldOrientation);\r
- Quat4d parentWQuat = new Quat4d();\r
- if (parentWR != null) {\r
- parentWQuat.set(G3DTools.getOrientation(parentWR));\r
- }\r
- else\r
- parentWQuat.w = 1.0;\r
- Point3d parentWPos = new Point3d();\r
- if (parentWP != null) {\r
- parentWPos = G3DTools.getPoint(parentWP);\r
- }\r
- if (DEBUG){\r
- if (parentWR != null) \r
- System.out.println("propagate transform " + parent.getResource() + " " + parentWPos + " " + G3DTools.getOrientation(parentWR));\r
- else\r
- System.out.println("propagate transform " + parent.getResource() + " " + parentWPos);\r
- }\r
- //for (IEntity n : children) {\r
- // if (!n.equals(node))\r
- // continue;\r
- IEntity wPos = node.getAtMostOneRelatedObject(Resources.g3dResource.HasWorldPosition);\r
- IEntity wRot = node.getAtMostOneRelatedObject(Resources.g3dResource.HasWorldOrientation);\r
- \r
- if (DEBUG) System.out.print(node);\r
- if (wRot != null) {\r
- AxisAngle4d aa = G3DTools.getOrientation(wRot);\r
- storeProperty(wRot.getResource(), aa);\r
- AxisAngle4d la = getLocalFromWorld(node, aa);\r
- IEntity lRot = node.getSingleRelatedObject(Resources.g3dResource.HasLocalOrientation);\r
- G3DTools.setOrientation(lRot,la);\r
- storeProperty(lRot.getResource(), la);\r
- }\r
- if (wPos != null) {\r
- Point3d lp = G3DTools.getPoint(wPos);\r
- storeProperty(wPos.getResource(), lp);\r
- lp.sub(parentWPos);\r
- parentWQuat.inverse(); \r
- MathTools.rotate(parentWQuat, lp, lp);\r
- IEntity lPos = node.getSingleRelatedObject(Resources.g3dResource.HasLocalPosition);\r
- G3DTools.setTuple3(lPos, lp);\r
- storeProperty(lPos.getResource(), lp);\r
- }\r
- if (DEBUG) System.out.println();\r
- propagateTransformChange(node);\r
- \r
- // }\r
- }\r
- \r
- public boolean transformationUpdate(Graph graph, Resource resource) {\r
- \r
- //resources.startTransaction("transformationUpdate");\r
- IEntity entity = EntityFactory.create(graph,resource);\r
- return transformationUpdate(entity);\r
- }\r
- \r
- public boolean transformationUpdate(IEntity node) {\r
- if (DEBUG) System.out.println("Node transformation update " + node.getResource());\r
- IEntity worldPos = node.getSingleRelatedObject(Resources.g3dResource.HasWorldPosition);\r
- IEntity localPos = node.getSingleRelatedObject(Resources.g3dResource.HasLocalPosition);\r
- IEntity worldOr = node.getAtMostOneRelatedObject(Resources.g3dResource.HasWorldOrientation);\r
- IEntity localOr = node.getAtMostOneRelatedObject(Resources.g3dResource.HasLocalOrientation);\r
- \r
- Tuple3d worldP =G3DTools.getPoint(worldPos);\r
- Tuple3d localP = G3DTools.getPoint(localPos);\r
-\r
- AxisAngle4d worldR = null;\r
- AxisAngle4d localR = null;\r
- if (worldOr != null) {\r
- worldR = G3DTools.getOrientation(worldOr);\r
- localR = G3DTools.getOrientation(localOr);\r
- }\r
- \r
- boolean changed = false;\r
- if (localP != null && worldP != null) {\r
- Tuple3d cachedWorldP = (Tuple3d)getProperty(worldPos.getResource());\r
- Tuple3d cachedLocalP = (Tuple3d)getProperty(localPos.getResource());\r
- boolean changedLocalP = false;\r
- boolean changedWorldP = false;\r
- if (cachedLocalP == null)\r
- changedLocalP = true;\r
- else if (changed(cachedLocalP,localP))\r
- changedLocalP = true;\r
-\r
- if (cachedWorldP == null) {\r
- changedWorldP = true;\r
- } else if (changed(cachedWorldP,worldP)){\r
- changedWorldP = true;\r
- }\r
- if (changedLocalP) {\r
- storeProperty(localPos.getResource(), localP);\r
- Tuple3d p = getWorldFromLocal(node, new Point3d(localP));\r
- storeProperty(worldPos.getResource(), p);\r
- G3DTools.setTuple3(worldPos, p);\r
- if (DEBUG) System.out.println("Node changed local: wp " + worldP + " lp " + p + " old " + cachedLocalP);\r
- changed = true;\r
- } else if (changedWorldP) {\r
- storeProperty(worldPos.getResource(), worldP);\r
- Tuple3d p = getLocalFromWorld(node, new Point3d(worldP));\r
- G3DTools.setTuple3(localPos, p);\r
- storeProperty(localPos.getResource(), p);\r
- if (DEBUG) System.out.println("Node changed world: wp " + worldP + " lp " + p + " old " + cachedWorldP);\r
- changed = true;\r
- }\r
- }\r
-\r
- if (localR != null || worldR != null) {\r
- AxisAngle4d cachedWorldR = (AxisAngle4d)getProperty(worldOr.getResource());\r
- AxisAngle4d cachedLocalR = (AxisAngle4d)getProperty(localOr.getResource());\r
- boolean changedLocalR = false;\r
- boolean changedWorldR = false;\r
-\r
- if (cachedLocalR == null)\r
- changedLocalR = true;\r
- else if (changed(cachedLocalR,localR))\r
- changedLocalR = true;\r
-\r
- if (cachedWorldR == null) {\r
- changedWorldR = true;\r
- } else if (changed(cachedWorldR,worldR)){\r
- changedWorldR = true;\r
- }\r
-\r
- if (changedLocalR) {\r
- storeProperty(localOr.getResource(), localR);\r
- AxisAngle4d p = getWorldFromLocal(node, new AxisAngle4d(localR));\r
- G3DTools.setOrientation(worldOr, p);\r
- storeProperty(worldOr.getResource(), p);\r
- if (DEBUG) System.out.println("Node changed localR: wr " + p + " lr " + localR + " old " + cachedLocalR);\r
- changed = true;\r
- } else if (changedWorldR) {\r
- storeProperty(worldOr.getResource(), worldR);\r
- AxisAngle4d p = getLocalFromWorld(node, new AxisAngle4d(worldR));\r
- G3DTools.setOrientation(localOr, p);\r
- storeProperty(localOr.getResource(), p);\r
- if (DEBUG) System.out.println("Node changed worldR: wr " + worldR + " lr " + p + " old " + cachedWorldR);\r
- changed = true;\r
- } \r
- }\r
-\r
- if (changed)\r
- propagateTransformChange(node);\r
- else if (DEBUG)\r
- System.out.println("No Node transformation change detected " + node.getResource());\r
- return changed;\r
- }\r
- \r
- public static boolean changed(Tuple3d v1, Tuple3d v2) {\r
- Vector3d t = new Vector3d(v1);\r
- t.sub(v2);\r
- return t.lengthSquared() > 0.00001;\r
- }\r
- \r
- public static boolean changed (double d1 , double d2) {\r
- return (Math.abs(d1 - d2) > 0.00001 );\r
- \r
- }\r
- \r
- public static boolean changed(AxisAngle4d aa1, AxisAngle4d aa2) {\r
- if (Math.abs(aa1.angle - aa2.angle) > 0.00001)\r
- return true;\r
- Vector3d t1 = new Vector3d(aa1.x-aa2.x,aa1.y-aa2.y,aa1.z-aa2.z);\r
- if (t1.lengthSquared() > 0.00001) {\r
- if (Math.abs(aa1.angle) < 0.0001)\r
- return false;\r
- return true;\r
- }\r
- return false;\r
- }\r
-\r
- \r
- private HashMap<Object, Object> properties = new HashMap<Object, Object>();\r
- \r
- public Object getProperty(Object key) {\r
- return properties.get(key);\r
- }\r
- \r
- public void storeProperty(Object key, Object value) {\r
- properties.put(key, value);\r
- }\r
- \r
- \r
- \r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import javax.vecmath.Color4f;\r
-\r
-import com.jme.renderer.ColorRGBA;\r
-\r
-public class VecmathJmeTools {\r
- \r
- public static javax.vecmath.Vector3f get(com.jme.math.Vector3f v) {\r
- return new javax.vecmath.Vector3f(v.x,v.y,v.z);\r
- }\r
- \r
- public static javax.vecmath.Vector3d getD(com.jme.math.Vector3f v) {\r
- return new javax.vecmath.Vector3d(v.x,v.y,v.z);\r
- }\r
- \r
- public static com.jme.math.Vector3f get(javax.vecmath.Tuple3f v) {\r
- return new com.jme.math.Vector3f(v.x,v.y,v.z);\r
- }\r
- \r
- public static com.jme.math.Vector3f get(javax.vecmath.Tuple3d v) {\r
- return new com.jme.math.Vector3f((float)v.x,(float)v.y,(float)v.z);\r
- }\r
- \r
- public static com.jme.math.Matrix3f get(javax.vecmath.Matrix3d m) {\r
- return new com.jme.math.Matrix3f((float)m.m00,(float)m.m01,(float)m.m02,(float)m.m10,(float)m.m11,(float)m.m12,(float)m.m20,(float)m.m21,(float)m.m22);\r
- }\r
- \r
- public static javax.vecmath.Quat4f get(com.jme.math.Quaternion v) {\r
- return new javax.vecmath.Quat4f(v.x,v.y,v.z,v.w);\r
- }\r
- \r
- public static javax.vecmath.Quat4d getD(com.jme.math.Quaternion v) {\r
- return new javax.vecmath.Quat4d(v.x,v.y,v.z,v.w);\r
- }\r
- \r
- \r
- public static com.jme.math.Quaternion get(javax.vecmath.Quat4f v) {\r
- return new com.jme.math.Quaternion(v.x,v.y,v.z,v.w);\r
- }\r
- \r
- public static com.jme.math.Quaternion get(javax.vecmath.Quat4d v) {\r
- return new com.jme.math.Quaternion((float)v.x,(float)v.y,(float)v.z,(float)v.w);\r
- }\r
- \r
- public static com.jme.math.Quaternion get(javax.vecmath.AxisAngle4f aa) {\r
- javax.vecmath.Quat4f v = new javax.vecmath.Quat4f();\r
- v.set(aa);\r
- return new com.jme.math.Quaternion(v.x,v.y,v.z,v.w);\r
- \r
- }\r
- \r
- public static com.jme.math.Quaternion get(javax.vecmath.AxisAngle4d aa) {\r
- javax.vecmath.Quat4f v = new javax.vecmath.Quat4f();\r
- v.set(aa);\r
- return new com.jme.math.Quaternion(v.x,v.y,v.z,v.w);\r
- \r
- }\r
- \r
- public static ColorRGBA get(Color4f c) {\r
- return new ColorRGBA(c.x,c.y,c.z,c.w);\r
- }\r
- \r
- public static Color4f get(ColorRGBA c) {\r
- return new Color4f(c.r,c.g,c.b,c.a);\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.base;\r
-\r
-import java.util.ArrayList;\r
-\r
-import org.eclipse.swt.widgets.Display;\r
-import org.eclipse.ui.PlatformUI;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-\r
-/**\r
- * TODO : This is a copy-paste from old proconf.utils plug-ing:\r
- * : PreferencePage is not ported,\r
- * : Using Webmon ?\r
- * \r
- * \r
- * VisualizationScheduler is singleton class that schedules\r
- * visualization redraws. \r
- * \r
- * Scheduler has three behaviour patters: \r
- * \r
- * ONCE : Redraws all visualizations one by one and then sleeps for\r
- * a while so that visualizations won't use all available cpu-time.\r
- * \r
- * ALWAYS : Redraws one visualization and sleeps before updating next\r
- * visualization.\r
- * \r
- * OFF : uses asyncExec busy-loop (doesn't block eclipse, but other applications may suffer) \r
- * \r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public class VisualizationScheduler implements Runnable{\r
- private static VisualizationScheduler instance;\r
- private Display display;\r
- private ArrayList<Runnable> visualizations;\r
- private boolean isDisposed = false;\r
- private boolean stateFlag = false;\r
- private static int sleepTime = 40;\r
- private int index = 0;\r
- \r
- public enum SleepType{ONCE,ALWAYS,OFF};\r
- \r
- private static SleepType sleepType = SleepType.ONCE;\r
- \r
- private VisualizationScheduler() {\r
- visualizations = new ArrayList<Runnable>();\r
- display = PlatformUI.getWorkbench().getDisplay();\r
- //sleepTime = UtilsPlugin.getDefault().getPreferenceStore().getInt(PreferenceConstants.SLEEP_TIME);\r
- //sleepType = SleepType.valueOf(UtilsPlugin.getDefault().getPreferenceStore().getString(PreferenceConstants.SLEEP_TYPE));\r
- run();\r
- }\r
-\r
- /**\r
- * Scheduler's run loop<br>\r
- * <br>\r
- * Loop contains two stages:<br>\r
- * In the first stage scheduler runs asyncExec for each visualization\r
- * and after that it runs itself with asyncExec.<br>\r
- * In the second stage scheduler runs itself with timerExec which allows OS to run it's own code.\r
- */\r
- public void run() {\r
- if (!isDisposed && !display.isDisposed() && !PlatformUI.getWorkbench().isClosing()) {\r
- switch(sleepType) {\r
- case ALWAYS:\r
- stateFlag = !stateFlag;\r
- if (stateFlag) {\r
- if (visualizations.size() > 0) {\r
- if (index >= visualizations.size())\r
- index = 0;\r
- Runnable scene = visualizations.get(index);\r
- try {\r
- display.asyncExec(scene);\r
- } catch (Exception e) {\r
- ErrorLogger.defaultLogWarning("Scheduler exception", e);\r
- }\r
- index++;\r
- }\r
- display.asyncExec(this);\r
- } else {\r
- display.timerExec(sleepTime, this);\r
- }\r
- break;\r
- case ONCE: \r
- stateFlag = !stateFlag;\r
- if (stateFlag) {\r
- for (Runnable scene : visualizations) {\r
- try {\r
- display.asyncExec(scene);\r
- } catch (Exception e) {\r
- ErrorLogger.defaultLogWarning("Scheduler exception",e);\r
- }\r
- }\r
- display.asyncExec(this);\r
- } else {\r
- display.timerExec(sleepTime,this);\r
- }\r
- break;\r
- case OFF: \r
- for (Runnable scene : visualizations) {\r
- try {\r
- display.asyncExec(scene);\r
- } catch (Exception e) {\r
- ErrorLogger.defaultLogWarning("Scheduler exception",e);\r
- }\r
- }\r
- display.asyncExec(this);\r
- break;\r
- }\r
- } \r
- }\r
- \r
- /**\r
- * Adds visualization into scheduler\r
- * @param scene\r
- */\r
- public void addVisualization(Runnable scene) {\r
- visualizations.add(scene);\r
- }\r
- \r
- /**\r
- * Removes visualization from scheduler\r
- * @param scene\r
- */\r
- public void removeVisualization(Runnable scene) {\r
- visualizations.remove(scene);\r
- }\r
- \r
- /**\r
- * disposes scheduler.\r
- *\r
- */\r
- public void dispose() {\r
- isDisposed = true;\r
- } \r
- \r
- /**\r
- * @return scheduler's instance\r
- */\r
- public static VisualizationScheduler getInstance() {\r
- if (instance == null)\r
- instance = new VisualizationScheduler();\r
- \r
- return instance;\r
- }\r
-\r
- /**\r
- * @return the sleep time of the scheduler\r
- */\r
- public int getSleepTime() {\r
- return sleepTime;\r
- }\r
-\r
- /**\r
- * <p>\r
- * Sets scheduler's sleep time. Larger sleep time gives more\r
- * cpu time to other applications, but makes visualizations less\r
- * responsive.\r
- * </p>\r
- * \r
- * @param sleepTime\r
- */\r
- public static void setSleepTime(int time) {\r
- sleepTime = time;\r
- }\r
-\r
-// public boolean isSleepAlways() {\r
-// return sleepAlways;\r
-// }\r
-\r
- /**\r
- * if this flag is set scheludler gives time to other aplications\r
- * between each visualization update. Otherwise all visualizations are updated in row and\r
- * then priority is given to other applications.\r
- * @param sleepAlways\r
- */\r
-// public static void setSleepAlways(boolean sleep) {\r
-// sleepAlways = sleep;\r
-// } \r
- \r
- public static SleepType getSleepType() {\r
- return sleepType;\r
- }\r
- \r
- public static void setSleepType(SleepType s) {\r
- sleepType = s;\r
- }\r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.common;\r
-\r
-\r
-import java.util.logging.LogManager;\r
-\r
-import org.eclipse.core.runtime.Path;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.ControlAdapter;\r
-import org.eclipse.swt.events.ControlEvent;\r
-import org.eclipse.swt.events.PaintEvent;\r
-import org.eclipse.swt.events.PaintListener;\r
-import org.eclipse.swt.graphics.Rectangle;\r
-import org.eclipse.swt.layout.FillLayout;\r
-import org.eclipse.swt.opengl.GLCanvas;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.simantics.proconf.g3d.base.JmeRenderingComponent;\r
-import org.simantics.proconf.g3d.base.ResourceTextureCache;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-import com.jme.renderer.Renderer;\r
-import com.jme.renderer.lwjgl.LWJGLRenderer;\r
-import com.jme.scene.Node;\r
-import com.jme.system.DisplaySystem;\r
-import com.jme.system.swt.SWTDisplaySystem;\r
-import com.jme.util.TextureManager;\r
-\r
-\r
-public class JmeComposite extends Composite {\r
- protected Node rootNode = new Node("root");\r
- private SWTDisplaySystem displaySystem;\r
- protected GLCanvas renderingCanvas;\r
- private JmeRenderingComponent component;\r
- \r
- public JmeComposite(Composite parent, JmeRenderingComponent component) {\r
- super(parent,SWT.NONE);\r
- if (component == null)\r
- throw new NullPointerException("Rendering component must not be null.");\r
- disableLog();\r
- //LoggingSystem.getLogger().setLevel(Level.OFF);\r
- this.component = component;\r
- this.setLayout(new FillLayout());\r
- displaySystem = (SWTDisplaySystem)DisplaySystem.getDisplaySystem("SWT");\r
- renderingCanvas = displaySystem.createCanvas(640, 480, this);\r
- renderingCanvas.addControlListener(new ControlAdapter() {\r
- public void controlResized(ControlEvent e) {\r
- resize();\r
- }\r
- });\r
- \r
-// this.addPaintListener(new PaintListener() {\r
-// @Override\r
-// public void paintControl(PaintEvent e) {\r
-// displaySystem.setCurrent();\r
-// JmeComposite.this.component.render();\r
-// }\r
-// });\r
- \r
- \r
- }\r
- \r
- private void disableLog() {\r
- //URL url = FileLocator.find(org.simantics.proconf.g3d.Activator.getDefault().getBundle(),new Path("logging.properties"),null);\r
- \r
- try {\r
- LogManager.getLogManager().readConfiguration(org.simantics.proconf.g3d.Activator.getDefault().openStream(new Path("logging.properties")));\r
- } catch (Exception e) {\r
- ErrorLogger.defaultLogError(e);\r
- }\r
- }\r
- \r
- public void resize() {\r
- displaySystem.setCurrent();\r
- LWJGLRenderer renderer = (LWJGLRenderer) displaySystem.getRenderer();\r
- if (renderer!= null) { \r
- Rectangle r = new Rectangle(renderingCanvas.getClientArea().x,renderingCanvas.getClientArea().y, renderingCanvas.getClientArea().width, renderingCanvas.getClientArea().height );\r
- if (r.width > 0 && r.height > 0)\r
- renderer.reinit(r.width, r.height);\r
- component.resize(r.width, r.height);\r
- }\r
- }\r
- \r
- public GLCanvas getCanvas() { \r
- return renderingCanvas;\r
- }\r
- \r
- public Renderer getRenderer() {\r
- return displaySystem.getRenderer();\r
- }\r
- \r
- public void initGL() {\r
- component.init(displaySystem);\r
- }\r
- \r
- public void dispose() {\r
- LWJGLRenderer renderer = (LWJGLRenderer) displaySystem.getRenderer();\r
- renderer.clearVBOCache();\r
- renderer.clearQueue();\r
- renderer.clearStatistics();\r
- renderingCanvas.dispose();\r
- if (displaySystem.destroy()) {\r
- \r
- TextureManager.doTextureCleanup();\r
- TextureManager.clearCache();\r
- ResourceTextureCache.getInstance().clear();\r
- }\r
- super.dispose();\r
- }\r
- \r
- public DisplaySystem getDisplaySystem() {\r
- return displaySystem;\r
- }\r
- \r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.common;\r
-\r
-import java.net.URL;\r
-\r
-import org.eclipse.core.runtime.FileLocator;\r
-import org.eclipse.core.runtime.Path;\r
-import org.simantics.proconf.g3d.Activator;\r
-import org.simantics.proconf.g3d.base.JmeRenderingComponent;\r
-import org.simantics.proconf.g3d.preferences.PreferenceConstants;\r
-\r
-import com.jme.image.Texture;\r
-import com.jme.light.DirectionalLight;\r
-import com.jme.math.Vector3f;\r
-import com.jme.renderer.Camera;\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.renderer.pass.BasicPassManager;\r
-import com.jme.renderer.pass.RenderPass;\r
-import com.jme.renderer.pass.ShadowedRenderPass;\r
-import com.jme.renderer.swt.SWTRenderer;\r
-import com.jme.scene.Node;\r
-import com.jme.scene.Spatial;\r
-import com.jme.scene.Text;\r
-import com.jme.scene.state.AlphaState;\r
-import com.jme.scene.state.LightState;\r
-import com.jme.scene.state.TextureState;\r
-import com.jme.scene.state.WireframeState;\r
-import com.jme.scene.state.ZBufferState;\r
-import com.jme.system.DisplaySystem;\r
-import com.jme.util.TextureManager;\r
-import com.jme.util.Timer;\r
-import com.jme.util.geom.Debugger;\r
-import com.jmex.effects.glsl.BloomRenderPass;\r
-import com.jmex.effects.glsl.SketchRenderPass;\r
-\r
-\r
-public class JmeSinglePassRenderingComponent extends JmeRenderingComponent {\r
- protected DisplaySystem displaySystem;\r
- protected Timer timer;\r
- protected Node rootNode = new Node("Root");\r
- protected Node shadowRootNode = new Node("Shadow");\r
- protected Node noCastShadowRootNode = new Node("No Cast Shadow");\r
- protected Node noShadowRootNode = new Node("No Shadow");\r
- protected Camera cam;\r
- protected float near = .1f;\r
- protected float far = 3000f;\r
- protected float fov = 55f;\r
- \r
- protected int projectionPolicy;\r
- \r
- /** The root node of our text. */\r
- protected Node orthoNode = new Node("ortho");\r
-\r
- /** Displays all the lovely information at the bottom. */\r
- protected Text fps;\r
- protected Text debug;\r
- protected String debugText = "";\r
- public static String fontLocation = "data/defaultfont.tga";//AppProperties.PATH_DEFAULT_FONT;\r
- \r
- \r
- protected BasicPassManager pManager = new BasicPassManager();\r
- \r
- private boolean showBounds = false;\r
- private boolean showNormals = false;\r
- private WireframeState ws = null;\r
- \r
- protected boolean projectionUpdated = false;\r
- \r
- public JmeSinglePassRenderingComponent() {\r
- \r
- }\r
- \r
- public void init(DisplaySystem displaySystem) {\r
- this.displaySystem = displaySystem;\r
- cam = displaySystem.getRenderer().createCamera(\r
- displaySystem.getRenderer().getWidth(), displaySystem.getRenderer().getHeight());\r
- displaySystem.getRenderer().setBackgroundColor(new ColorRGBA(0.2f,0.2f,0.2f,0.f));//(0.357F, 0.647F, 0.890F, 1.0F));\r
- displaySystem.getRenderer().getQueue().setTwoPassTransparency(true);\r
- cam.setFrustumPerspective(fov,\r
- (float) displaySystem.getRenderer().getWidth()/\r
- (float) displaySystem.getRenderer().getHeight(),near, far);\r
- projectionPolicy = PERSPECTIVE_PROJECTION;\r
- Vector3f loc = new Vector3f(0.0f, 0.0f, 10.0f);\r
- Vector3f left = new Vector3f(-1.0f, 0.0f, 0.0f);\r
- Vector3f up = new Vector3f(0.0f, 1.0f, 0.0f);\r
- Vector3f dir = new Vector3f(0.0f, 0f, -1.0f);\r
- /** Move our camera to a correct place and orientation. */\r
- cam.setFrame(loc, left, up, dir);\r
- /** Signal that we've changed our camera's location/frustum. */\r
- cam.update();\r
- displaySystem.getRenderer().setCamera(cam);\r
- timer = Timer.getTimer();\r
- displaySystem.setTitle("ShapeEditor");\r
- displaySystem.getRenderer().enableStatistics(true);\r
- \r
- initRoot();\r
- }\r
- \r
- protected Texture loadFontTexture() {\r
- URL url = FileLocator.find(org.simantics.proconf.g3d.Activator.getDefault().getBundle(),new Path(fontLocation),null);\r
- return TextureManager.loadTexture(url, Texture.MM_LINEAR,\r
- Texture.FM_LINEAR);\r
- }\r
- \r
- protected void initRoot() {\r
- ZBufferState buf = displaySystem.getRenderer().createZBufferState();\r
- buf.setEnabled(true);\r
- buf.setFunction(ZBufferState.CF_LEQUAL);\r
- //buf.setWritable(false);\r
- rootNode.setRenderState(buf); \r
- rootNode.attachChild(noShadowRootNode);\r
- rootNode.attachChild(noCastShadowRootNode);\r
- rootNode.attachChild(shadowRootNode);\r
- noShadowRootNode.setCullMode(Spatial.CULL_NEVER);\r
- \r
- //PointLight light = new PointLight();\r
- DirectionalLight light = new DirectionalLight();\r
- light.setDiffuse( new ColorRGBA( 0.75f, 0.75f, 0.75f, 0.75f ) );\r
- light.setAmbient( new ColorRGBA( 0.5f, 0.5f, 0.5f, 0.5f ) );\r
- //light.setLocation( new Vector3f( 100, 100, 100 ) );\r
- light.setDirection(new Vector3f( -100, -150, -100 ));\r
- light.setEnabled( true );\r
- light.setShadowCaster(true);\r
- \r
- LightState lightState = displaySystem.getRenderer().createLightState();\r
- lightState.setEnabled( true );\r
- lightState.attach( light );\r
- lightState.setSeparateSpecular(true);\r
- lightState.setTwoSidedLighting(false);\r
- rootNode.setRenderState( lightState );\r
- \r
- ws = displaySystem.getRenderer().createWireframeState();\r
- ws.setEnabled(false);\r
- rootNode.setRenderState(ws);\r
- \r
- AlphaState as1 = displaySystem.getRenderer().createAlphaState();\r
- as1.setBlendEnabled(true);\r
- as1.setSrcFunction(AlphaState.SB_SRC_ALPHA);\r
- as1.setDstFunction(AlphaState.DB_ONE);\r
- as1.setTestEnabled(true);\r
- as1.setTestFunction(AlphaState.TF_GREATER);\r
- as1.setEnabled(true);\r
- \r
- TextureState font = displaySystem.getRenderer().createTextureState();\r
- /** The texture is loaded from fontLocation */\r
- font.setTexture(loadFontTexture());\r
-\r
- font.setEnabled(true);\r
-\r
- // Then our font Text object.\r
- /** This is what will actually have the text at the bottom. */\r
- fps = new Text("FPS label", "");\r
- fps.setCullMode(Spatial.CULL_NEVER);\r
- fps.setTextureCombineMode(TextureState.REPLACE);\r
- \r
- debug = new Text("Debug", "Debug");\r
- debug.setCullMode(Spatial.CULL_NEVER);\r
- debug.setTextureCombineMode(TextureState.REPLACE);\r
- debug.setLocalTranslation(new Vector3f(1.f,10.f,0.f));\r
-\r
- // Finally, a stand alone node (not attached to root on purpose)\r
- Node fpsNode = new Node("FPS node");\r
- fpsNode.attachChild(fps);\r
- fpsNode.attachChild(debug);\r
- fpsNode.setRenderState(font);\r
- fpsNode.setRenderState(as1);\r
- fpsNode.setCullMode(Spatial.CULL_NEVER);\r
- orthoNode.attachChild(fpsNode);\r
- \r
- rootNode.updateGeometricState(0.0f, true);\r
- rootNode.updateRenderState();\r
- \r
- orthoNode.updateGeometricState(0.0f, true);\r
- orthoNode.updateRenderState();\r
- if (Activator.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.SHADOWS)) {\r
- ShadowedRenderPass shadowRootPass = new ShadowedRenderPass();\r
- shadowRootPass.add(shadowRootNode);\r
- shadowRootPass.add(noCastShadowRootNode);\r
- shadowRootPass.addOccluder(shadowRootNode);\r
- pManager.add(shadowRootPass);\r
- //rootPass.setRenderShadows(false);\r
- shadowRootPass.setShadowColor(new ColorRGBA(0.1f,0.1f,0.1f,0.9f));\r
- shadowRootPass.setLightingMethod(ShadowedRenderPass.MODULATIVE);\r
- RenderPass rootPass = new RenderPass();\r
- rootPass.add(noShadowRootNode);\r
- pManager.add(rootPass);\r
- } else {\r
- RenderPass rootPass = new RenderPass();\r
- rootPass.add(rootNode);\r
- pManager.add(rootPass);\r
- }\r
- \r
- String postProcess = Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.POST_PROCESS);\r
- if (postProcess.startsWith("bloom")) {\r
- BloomRenderPass bloomRenderPass = new BloomRenderPass(cam, 4);\r
- if (bloomRenderPass.isSupported()) {\r
- bloomRenderPass.add(rootNode);\r
- bloomRenderPass.setUseCurrentScene(false);\r
- pManager.add(bloomRenderPass);\r
- }\r
- } else if (postProcess.startsWith("sketch")) {\r
- SketchRenderPass sketchRenderPass = new SketchRenderPass(cam, 4);\r
- if (sketchRenderPass.isSupported()) {\r
- sketchRenderPass.add(rootNode);\r
- pManager.add(sketchRenderPass);\r
- }\r
- }\r
-\r
- \r
- RenderPass fpsPass = new RenderPass();\r
- fpsPass.add(orthoNode);\r
- pManager.add(fpsPass);\r
- }\r
- \r
- public void render() {\r
- displaySystem.setCurrent();\r
- /** Recalculate the framerate. */\r
- timer.update();\r
- \r
- /** Update tpf to time per frame according to the Timer. */\r
- float tpf = timer.getTimePerFrame();\r
- /** Send the fps to our fps bar at the bottom. */\r
- fps.print("FPS: " + (int) timer.getFrameRate() + " - "\r
- + displaySystem.getRenderer().getStatistics());\r
- /**\r
- * Update the physics for this world.\r
- */\r
- debug.print(debugText);\r
-\r
- /** Update controllers/render states/transforms/bounds for rootNode. */\r
- rootNode.updateGeometricState(tpf, true);\r
- rootNode.updateRenderState();\r
- \r
- orthoNode.updateGeometricState(tpf, true);\r
- orthoNode.updateRenderState();\r
- \r
- displaySystem.getRenderer().clearStatistics();\r
- /** Clears the previously rendered information. */\r
- displaySystem.getRenderer().clearBuffers();\r
-\r
- pManager.updatePasses(tpf);\r
- \r
- pManager.renderPasses(displaySystem.getRenderer());\r
- if ( showBounds ) {\r
- Debugger.drawBounds( shadowRootNode, displaySystem.getRenderer(), true );\r
- }\r
-\r
- if ( showNormals ) {\r
- Debugger.drawNormals( shadowRootNode, displaySystem.getRenderer());\r
- }\r
- displaySystem.getRenderer().displayBackBuffer();\r
- \r
- \r
- \r
- //swap buffers\r
- ((SWTRenderer)displaySystem.getRenderer()).swap();\r
- }\r
- \r
- @Override\r
- public void resize(int width, int height) {\r
- updateProjection();\r
- }\r
- \r
- @Override\r
- public Node getShadowRoot() {\r
- return shadowRootNode;\r
- }\r
- \r
- @Override\r
- public Node getNoCastRoot() {\r
- return noCastShadowRootNode;\r
- }\r
- \r
- @Override\r
- public Node getRoot() {\r
- return rootNode;\r
- }\r
- \r
- @Override\r
- public Node getOrthoNode() {\r
- return orthoNode;\r
- }\r
- \r
- @Override\r
- public Node getNoShadowRoot() {\r
- return noShadowRootNode;\r
- }\r
- \r
-// public void setRootNode(Node node) {\r
-// rootNode = node;\r
-// initRoot();\r
-// }\r
- \r
- @Override\r
- public int getProjectionPolicy() {\r
- return projectionPolicy;\r
- }\r
- \r
- @Override\r
- public void setProjectionPolicy(int policy) {\r
- if (policy != projectionPolicy) {\r
- projectionPolicy = policy;\r
- updateProjection();\r
- }\r
- }\r
- \r
- protected void updateProjection() {\r
- switch (projectionPolicy) {\r
- case PERSPECTIVE_PROJECTION:\r
- cam.setParallelProjection(false);\r
- cam.setFrustumPerspective(fov,\r
- (float) displaySystem.getRenderer().getWidth() /\r
- (float) displaySystem.getRenderer().getHeight(),near, far);\r
- break;\r
- \r
- case PARALLEL_PROJECTION:\r
- cam.setParallelProjection(true);\r
- break;\r
- }\r
- cam.update();\r
- projectionUpdated = true;\r
- }\r
- \r
- @Override\r
- public float getScreenScale() {\r
- //System.out.println(cam.getFrustumLeft() + " " + cam.getFrustumRight() + " " + cam.getFrustumBottom() + " " + cam.getFrustumTop()+ " " + cam.getFrustumNear() + " " + cam.getFrustumFar());\r
- return Math.abs(cam.getFrustumTop());\r
- }\r
- \r
- @Override\r
- public void setScreenScale(float screenScale) {\r
- float aspect = (float) displaySystem.getRenderer().getWidth() /\r
- (float) displaySystem.getRenderer().getHeight();\r
- cam.setFrustum(-screenScale*8.f, cam.getFrustumFar(), -screenScale*aspect, screenScale*aspect, -screenScale, screenScale);\r
- }\r
- \r
- @Override\r
- public float getFieldOfView() {\r
- return fov;\r
- }\r
- \r
- @Override\r
- public void dispose() {\r
- pManager.cleanUp();\r
- rootNode.dispose();\r
- rootNode = null;\r
- noShadowRootNode = null;\r
- noCastShadowRootNode = null;\r
- orthoNode = null;\r
- shadowRootNode = null;\r
- }\r
- \r
- @Override\r
- public boolean update() {\r
- if (!projectionUpdated) {\r
- return false;\r
- }\r
- projectionUpdated = false;\r
- return true;\r
- }\r
- \r
- @Override\r
- public Camera getCamera() {\r
- return cam;\r
- }\r
- \r
- @Override\r
- public DisplaySystem getDisplaySystem() {\r
- return displaySystem;\r
- }\r
- \r
- public void setDebugText(String text) {\r
- this.debugText = text;\r
- //System.out.println("JmeSinglePass.setDebugText() " + text);\r
- }\r
- \r
- public void setShowNormals(boolean b) {\r
- showNormals = b;\r
- }\r
- \r
- public void setShowBounds(boolean b) {\r
- showBounds = b;\r
- }\r
- \r
- public void setShowWireframe(boolean b) {\r
- ws.setEnabled(b);\r
- }\r
- \r
- public boolean isShowNormals() {\r
- return showNormals;\r
- }\r
- \r
- public boolean isShowBounds() {\r
- return showBounds;\r
- }\r
- \r
- public boolean isShowWireframe() {\r
- return ws.isEnabled();\r
- }\r
- \r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.common;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.Matrix3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.simantics.proconf.g3d.base.VecmathJmeTools;\r
-\r
-import com.jme.renderer.Camera;\r
-\r
-\r
-/**\r
- * Orbital camera\r
- * <p>\r
- * Modified version of fi.vtt.proconf.webmon.graphics3d.utils.OrbitalCamera<br>\r
- * Using floats instead of double<br>\r
- * </p>\r
- * \r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public class OrbitalCamera {\r
- \r
- private Vector3d up = new Vector3d(0.0,1.0,0.0);\r
- private static Vector3d up2 = new Vector3d(0.0,0.0,-1.0);\r
- private static double minDistance = 0.5;\r
- private Vector3d target = new Vector3d();\r
- private Vector3d cameraPos = new Vector3d(10.0,0.0,0.0);\r
- \r
- \r
- public void translate(Vector3d v) {\r
- target.add(v);\r
- cameraPos.add(v);\r
- }\r
- \r
- public void rotateAroundTarget(Vector3d axis, double angle) {\r
- Vector3d temp = new Vector3d(cameraPos);\r
- temp.sub(target);\r
- Matrix3d rotation = new Matrix3d();\r
- rotation.set(new AxisAngle4d(axis,angle));\r
- rotation.transform(temp);\r
- temp.add(target);\r
- cameraPos.set(temp); \r
- }\r
- \r
- public Vector3d getUnNormalizedHeading() {\r
- Vector3d heading = new Vector3d(target);\r
- heading.sub(cameraPos);\r
- return heading;\r
- }\r
- \r
- public Vector3d getUnNormalizedRight() {\r
- Vector3d heading = getUnNormalizedHeading();\r
- Vector3d right = new Vector3d();\r
- right.cross(heading,up);\r
- if (right.lengthSquared() < 0.01)\r
- right.cross(heading,up2);\r
- return right;\r
- }\r
- \r
- public double getDistanceToTarget() {\r
- Vector3d t = new Vector3d(target);\r
- t.sub(cameraPos);\r
- return t.length();\r
- }\r
- \r
- public void moveToTarget(double distance) {\r
- Vector3d heading = getUnNormalizedHeading();\r
- double length = heading.length();\r
- if (length + distance < minDistance) {\r
- // cannot move closer\r
- return;\r
- }\r
- heading.scale(distance / length); //normalizing and scaling by distance\r
- cameraPos.add(heading);\r
- }\r
- \r
- public void moveScaledToTarget(double s) {\r
- Vector3d heading = getUnNormalizedHeading();\r
- double currentLength = heading.length();\r
- double length = currentLength * (1.0 - s);// heading.length();\r
- if (length < minDistance) {\r
- s = -minDistance / currentLength + 1.0;\r
- }\r
- heading.scale(s);\r
- //normalizing and scaling by distance\r
- cameraPos.add(heading);\r
- }\r
- \r
- public void rotateUp(double angle) {\r
- Vector3d right = getUnNormalizedRight();\r
- double length = right.length();\r
- // TODO : better handling of singular cases\r
- if (length > 0.01)\r
- right.scale(1.0/length);\r
- else \r
- right.set(-1.0,0.0,0.0);\r
- rotateAroundTarget(right,angle);\r
- }\r
- \r
- public void rotateRight(double angle) {\r
- rotateAroundTarget(up,angle);\r
- }\r
- \r
- public void moveRight(double length) {\r
- Vector3d right = getUnNormalizedRight();\r
- right.normalize();\r
- right.scale(length);\r
- translate(right);\r
- }\r
- \r
- public void moveUp(double length) {\r
- Vector3d u = new Vector3d(up);\r
- u.scale(length);\r
- translate(u);\r
- }\r
- \r
- public void moveFront(double length) {\r
- Vector3d right = getUnNormalizedRight();\r
- Vector3d front = new Vector3d();\r
- front.cross(up,right);\r
- front.normalize();\r
- front.scale(length);\r
- translate(front);\r
- }\r
- \r
- public void updateCamera() {\r
- Vector3d t = new Vector3d(cameraPos);\r
- t.sub(target);\r
- t.normalize();\r
- cam.setLocation(VecmathJmeTools.get(cameraPos));\r
- \r
- if (Math.abs(t.dot(up)) > 0.99) {\r
- cam.lookAt(VecmathJmeTools.get(target), VecmathJmeTools.get(up2)); \r
- } else {\r
- cam.lookAt(VecmathJmeTools.get(target), VecmathJmeTools.get(up));\r
- }\r
- cam.update();\r
- cam.apply();\r
- \r
- }\r
-\r
- /**\r
- * @return Returns the cameraPos.\r
- */\r
- public Vector3d getCameraPos() {\r
- return cameraPos;\r
- }\r
-\r
- /**\r
- * @param cameraPos The cameraPos to set.\r
- */\r
- public void setCameraPos(Vector3d cameraPos) {\r
- this.cameraPos = cameraPos;\r
- }\r
-\r
- /**\r
- * @return Returns the target.\r
- */\r
- public Vector3d getTarget() {\r
- return target;\r
- }\r
-\r
- /**\r
- * @param target The target to set.\r
- */\r
- public void setTarget(Vector3d target) {\r
- this.target = target;\r
- }\r
- \r
- public void setCameraPosRelativeToTarget(Vector3d targetToCam) {\r
- targetToCam.add(target);\r
- setCameraPos(targetToCam);\r
- }\r
- \r
- public void setUp(Vector3d v) {\r
- up.set(v);\r
- }\r
- \r
- public Vector3d getUp() {\r
- return up;\r
- }\r
- \r
- public void setDefaultUp() {\r
- up.set(0.0,1.0,0.0);\r
- }\r
- \r
- private Camera cam;\r
- \r
- public void setCamera(Camera cam) {\r
- this.cam = cam;\r
- }\r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.common;\r
-\r
-import org.eclipse.core.expressions.PropertyTester;\r
-\r
-public class PropertyTester2 extends PropertyTester {\r
-\r
- public PropertyTester2() {\r
- // TODO Auto-generated constructor stub\r
- }\r
-\r
- @Override\r
- public boolean test(Object receiver, String property, Object[] args,\r
- Object expectedValue) {\r
- // TODO Auto-generated method stub\r
- return false;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.common;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Arrays;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-import org.eclipse.jface.viewers.IStructuredSelection;\r
-import org.simantics.db.Resource;\r
-\r
-\r
-/**\r
- * StructuredSelection that contains ResourceSelections\r
- * \r
- * @author Marko Luukkainen\r
- * @author Tuukka Lehtonen\r
- */\r
-public class StructuredResourceSelection implements IStructuredSelection {\r
- \r
- public static final StructuredResourceSelection EMPTY = new StructuredResourceSelection() {\r
- // Create an empty fixed size List to ensure the list is not modified.\r
- private List<Resource> empty = Arrays.asList(); \r
- \r
- public void add(Resource rs) {\r
- throw new UnsupportedOperationException("BUG: attempted to modify StructuredResourceSelection.EMPTY");\r
- }\r
- public List<Resource> getSelectionList() {\r
- return empty;\r
- }\r
- };\r
-\r
- private List<Resource> selections;\r
- \r
- /**\r
- * Creates a new selection that doesn't contain any items\r
- */\r
- public StructuredResourceSelection() {\r
- }\r
-\r
- public StructuredResourceSelection(Resource rs) {\r
- getSelectionList().add(rs);\r
- }\r
-\r
- public StructuredResourceSelection(Resource... rss) {\r
- List<Resource> s = getSelectionList();\r
- for (Resource rs : rss)\r
- s.add(rs);\r
- }\r
-\r
- public void add(Resource rs) {\r
- getSelectionList().add(rs);\r
- }\r
-\r
- public List<Resource> getSelectionList() {\r
- if (selections == null) {\r
- selections = new ArrayList<Resource>();\r
- }\r
- return selections;\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see org.eclipse.jface.viewers.ISelection#isEmpty()\r
- */\r
- public boolean isEmpty() {\r
- return selections == null || selections.isEmpty();\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see org.eclipse.jface.viewers.IStructuredSelection#getFirstElement()\r
- */\r
- public Object getFirstElement() {\r
- if (!isEmpty())\r
- return selections.get(0);\r
- return null;\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see org.eclipse.jface.viewers.IStructuredSelection#iterator()\r
- */\r
- public Iterator<Resource> iterator() {\r
- return getSelectionList().iterator();\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see org.eclipse.jface.viewers.IStructuredSelection#size()\r
- */\r
- public int size() {\r
- return selections == null ? 0 : selections.size();\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see org.eclipse.jface.viewers.IStructuredSelection#toArray()\r
- */\r
- public Object[] toArray() {\r
- return selections == null ? new Object[0] : selections.toArray();\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see org.eclipse.jface.viewers.IStructuredSelection#toList()\r
- */\r
- public List<Resource> toList() {\r
- return selections == null ? Arrays.asList(new Resource[0]) : selections;\r
- }\r
-\r
- /**\r
- * Returns whether this structured selection is equal to the given object.\r
- * Two structured selections are equal iff they contain the same elements\r
- * in the same order.\r
- *\r
- * @param o the other object\r
- * @return <code>true</code> if they are equal, and <code>false</code> otherwise\r
- */\r
- public boolean equals(Object o) {\r
- if (this == o) {\r
- return true;\r
- }\r
- // null and other classes\r
- if (!(o instanceof StructuredResourceSelection)) {\r
- return false;\r
- }\r
- StructuredResourceSelection other = (StructuredResourceSelection) o;\r
-\r
- // either or both empty?\r
- if (isEmpty()) {\r
- return other.isEmpty();\r
- }\r
- if (other.isEmpty()) {\r
- return false;\r
- }\r
-\r
- // check size\r
- if (size() != other.size())\r
- return false;\r
- \r
- // element comparison\r
- Iterator<Resource> it = iterator();\r
- Iterator<Resource> otherIt = other.iterator();\r
- while (it.hasNext()) {\r
- if (!it.next().equals(otherIt.next()))\r
- return false;\r
- }\r
- \r
- return true;\r
- }\r
- \r
- @Override\r
- public String toString() {\r
- return Arrays.toString(getSelectionList().toArray());\r
- }\r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.dialogs;\r
-\r
-import org.eclipse.jface.dialogs.Dialog;\r
-import org.eclipse.jface.dialogs.IDialogConstants;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.MouseAdapter;\r
-import org.eclipse.swt.events.MouseEvent;\r
-import org.eclipse.swt.events.SelectionAdapter;\r
-import org.eclipse.swt.events.SelectionEvent;\r
-import org.eclipse.swt.graphics.Color;\r
-import org.eclipse.swt.graphics.RGB;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.widgets.Button;\r
-import org.eclipse.swt.widgets.ColorDialog;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.Shell;\r
-\r
-public class JMEDialog extends Dialog {\r
- private boolean bounds;\r
- private boolean normals;\r
- private boolean wireframe;\r
- private float[] floatColor = null;\r
- private Button boundsButton;\r
- private Button normalsButton;\r
- private Button wireframeButton;\r
- private Composite colorComposite;\r
- private Color color = null;\r
- \r
- public JMEDialog(Shell parentShell) {\r
- super(parentShell);\r
- }\r
-\r
- \r
- @Override\r
- protected void configureShell(Shell newShell) {\r
- super.configureShell(newShell);\r
- newShell.setText("Configure new pipeline");\r
- }\r
- \r
- @Override\r
- protected Control createDialogArea(Composite parent) {\r
- Composite composite = (Composite) super.createDialogArea(parent);\r
- Label label = new Label(composite, SWT.WRAP);\r
- label.setText("JME Configuration");\r
- GridData data = new GridData(GridData.GRAB_HORIZONTAL\r
- | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL\r
- | GridData.VERTICAL_ALIGN_CENTER);\r
- \r
- data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);\r
- boundsButton = new Button(composite,SWT.CHECK);\r
- boundsButton.setText("Show bounds");\r
- boundsButton.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- bounds = boundsButton.getSelection();\r
- }\r
- });\r
- boundsButton.setSelection(bounds);\r
- normalsButton = new Button(composite,SWT.CHECK);\r
- normalsButton.setText("Show normals");\r
- normalsButton.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- normals = normalsButton.getSelection();\r
- }\r
- });\r
- normalsButton.setSelection(normals);\r
- wireframeButton = new Button(composite,SWT.CHECK);\r
- wireframeButton.setText("Show wireframe");\r
- wireframeButton.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- wireframe = wireframeButton.getSelection();\r
- }\r
- });\r
- wireframeButton.setSelection(wireframe);\r
- \r
- colorComposite = new Composite(composite,SWT.BORDER);\r
- colorComposite.addMouseListener(new MouseAdapter() {\r
- @Override\r
- public void mouseUp(MouseEvent e) {\r
- ColorDialog dialog = new ColorDialog(JMEDialog.this.getShell());\r
- RGB rgb = dialog.open();\r
- if (rgb != null) {\r
- if (color != null)\r
- color.dispose();\r
- color = new Color(JMEDialog.this.getShell().getDisplay(),rgb);\r
- colorComposite.setBackground(color);\r
- floatColor = new float[]{rgb.red/255.f,rgb.green/255.f,rgb.blue/255.f};\r
- }\r
- }\r
- });\r
- updateColor();\r
- \r
- return composite;\r
- }\r
- \r
- @Override\r
- public int open() {\r
- return super.open();\r
- }\r
-\r
-\r
- public boolean isBounds() {\r
- return bounds;\r
- }\r
-\r
-\r
- public void setBounds(boolean bounds) {\r
- this.bounds = bounds;\r
- }\r
-\r
-\r
- public boolean isNormals() {\r
- return normals;\r
- }\r
-\r
-\r
- public void setNormals(boolean normals) {\r
- this.normals = normals;\r
- }\r
-\r
-\r
- public boolean isWireframe() {\r
- return wireframe;\r
- }\r
-\r
-\r
- public void setWireframe(boolean wireframe) {\r
- this.wireframe = wireframe;\r
- }\r
- \r
- \r
- public float[] getFloatColor() {\r
- return floatColor;\r
- }\r
-\r
- public void setFloatColor(float[] c) {\r
- this.floatColor = c;\r
- if (floatColor == null)\r
- return;\r
- \r
- updateColor();\r
- }\r
- \r
- private void updateColor() {\r
- if (colorComposite == null)\r
- return;\r
- if (color != null)\r
- color.dispose();\r
- RGB rgb = new RGB((int)(floatColor[0]*255.f),(int)(floatColor[1]*255.f),(int)(floatColor[2]*255.f));\r
- color = new Color(JMEDialog.this.getShell().getDisplay(),rgb);\r
- colorComposite.setBackground(color);\r
- }\r
-\r
- \r
-\r
-\r
- \r
- \r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.dnd;\r
-\r
-import org.simantics.db.Resource;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-\r
-\r
-\r
-public interface DropListener {\r
- \r
- boolean acceptDrop(StructuredResourceSelection s, Resource res[]);\r
- void doDrop(StructuredResourceSelection s, Resource res[]);\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.dnd;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import org.eclipse.swt.dnd.DND;\r
-import org.eclipse.swt.dnd.DropTarget;\r
-import org.eclipse.swt.dnd.DropTargetEvent;\r
-import org.eclipse.swt.dnd.DropTargetListener;\r
-import org.eclipse.swt.dnd.TextTransfer;\r
-import org.eclipse.swt.dnd.Transfer;\r
-import org.eclipse.swt.dnd.TransferData;\r
-import org.eclipse.swt.graphics.Point;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.simantics.db.Resource;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-import org.simantics.proconf.ui.dnd.ResourceReferenceTransfer;\r
-\r
-public class ShapeDropTarget implements DropTargetListener{\r
- ThreeDimensionalEditorBase editor;\r
- List<DropListener> listeners;\r
- final Control control;\r
- private DropTarget target; \r
- \r
- public ShapeDropTarget(ThreeDimensionalEditorBase editor) {\r
- this.editor = editor;\r
- listeners = new ArrayList<DropListener>();\r
- this.control = editor.getRenderingComposite();\r
- \r
- target = new DropTarget(control, DND.DROP_LINK);\r
- target.setTransfer(new Transfer[] { ResourceReferenceTransfer.getInstance() });\r
- target.addDropListener(this); \r
- }\r
- \r
- public void addDropListener(DropListener listener) {\r
- listeners.add(listener);\r
- }\r
- \r
- public void removeDropListener(DropListener listener) {\r
- listeners.remove(listener);\r
- }\r
- \r
- @Override\r
- public void dragEnter(DropTargetEvent event) {\r
- event.detail = DND.DROP_LINK;\r
- dragOver(event);\r
- }\r
- \r
- public void dragOperationChanged(DropTargetEvent event) {\r
- }\r
- \r
- public void dropAccept(DropTargetEvent event) {\r
- }\r
- \r
- public void dragLeave(DropTargetEvent event) {\r
- }\r
-\r
- \r
- @Override\r
- public void dragOver(DropTargetEvent event) {\r
- // FIXME : a hack to get the actual data (probably works only in Windows)\r
- TransferData data = event.currentDataType;\r
- if(!TextTransfer.getInstance().isSupportedType(data))\r
- return;\r
- Object o = TextTransfer.getInstance().nativeToJava(data);\r
- \r
- Point p = getLocalCoords(event);\r
- editor.getInputProvider().setMouseMoved(true);\r
- editor.getInputProvider().setMouseX(p.x);\r
- editor.getInputProvider().setMouseY(p.y);\r
- editor.run();\r
- StructuredResourceSelection sel = editor.getSelectionAdapter().getHighlightSelection();\r
- \r
- event.data = o;\r
- Resource ids[] = parseEventData(event);\r
- for (DropListener l : listeners) {\r
- if(l.acceptDrop(sel, ids)) {\r
- event.detail = DND.DROP_LINK;\r
- return;\r
- }\r
- }\r
- event.detail = DND.DROP_NONE; \r
- }\r
- \r
- @Override\r
- public void drop(DropTargetEvent event) {\r
- StructuredResourceSelection sel = editor.getSelectionAdapter().getHighlightSelection();\r
- Resource ids[] = parseEventData(event);\r
- for (DropListener l : listeners) {\r
- if(l.acceptDrop(sel, ids)) {\r
- l.doDrop(sel, ids);\r
- return;\r
- }\r
- }\r
- }\r
- \r
- protected Point getLocalCoords(DropTargetEvent event) {\r
- return editor.getRenderingComposite().toControl(event.x, event.y);\r
- }\r
- \r
- public void dispose()\r
- {\r
- target.removeDropListener(this);\r
- target = null;\r
- }\r
- \r
- private Resource[] parseEventData(DropTargetEvent event) {\r
- if (ResourceReferenceTransfer.getInstance().isSupportedType(event.currentDataType) && (event.data instanceof Resource[])) {\r
- return (Resource[]) event.data;\r
- }\r
- return null;\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.gizmo;\r
-\r
-import javax.vecmath.AxisAngle4f;\r
-import javax.vecmath.Color4f;\r
-import javax.vecmath.Quat4f;\r
-import javax.vecmath.Tuple3d;\r
-import javax.vecmath.Tuple3f;\r
-import javax.vecmath.Vector3d;\r
-import javax.vecmath.Vector3f;\r
-\r
-import org.simantics.proconf.g3d.Activator;\r
-import org.simantics.proconf.g3d.base.JmeRenderingComponent;\r
-import org.simantics.proconf.g3d.base.VecmathJmeTools;\r
-import org.simantics.proconf.g3d.preferences.PreferenceConstants;\r
-\r
-import com.jme.renderer.Renderer;\r
-import com.jme.scene.Node;\r
-\r
-\r
-public abstract class AbstractGizmo implements Gizmo{\r
- \r
- private Node position;\r
- private Node rotate;\r
- private Node scale;\r
- \r
- private boolean changed = false;\r
- \r
- private double userScale = 1.0;\r
- \r
- public AbstractGizmo() {\r
- createGroups();\r
- }\r
- \r
- public void setChanged(boolean b) {\r
- changed = b;\r
- }\r
- \r
- public boolean isChanged() {\r
- return changed;\r
- }\r
- \r
- public double getUserScale() {\r
- return Activator.getDefault().getPreferenceStore().getDouble(PreferenceConstants.GIZMO_SCALE);\r
- }\r
- \r
- \r
- public void setScale(float scale) {\r
- this.scale.setLocalScale(scale);\r
- }\r
- \r
- public void setScale(Vector3f scale) {\r
- this.scale.setLocalScale(VecmathJmeTools.get(scale));\r
- }\r
- \r
- public Vector3d getPosition() {\r
- return VecmathJmeTools.getD(position.getWorldTranslation());\r
- }\r
- \r
- public Vector3f getPositionFloat() {\r
- return VecmathJmeTools.get(position.getWorldTranslation());\r
- }\r
- \r
- public void setPosition(Tuple3d position) {\r
- this.position.setLocalTranslation(VecmathJmeTools.get(position));\r
- }\r
- \r
- public void setPosition(Vector3f position) {\r
- this.position.setLocalTranslation(VecmathJmeTools.get(position));\r
- }\r
- \r
- public void setRotation(Quat4f q) {\r
- rotate.setLocalRotation(VecmathJmeTools.get(q));\r
- }\r
- \r
- public void setRotation(AxisAngle4f q) {\r
- rotate.setLocalRotation(VecmathJmeTools.get(q));\r
- }\r
- \r
- public Node getNode() {\r
- userScale = getUserScale();\r
- return position;\r
- }\r
- \r
- protected Node getGizmoNode() {\r
- return scale;\r
- }\r
- \r
- private void createGroups() {\r
-\r
- position = new Node();\r
- rotate = new Node();\r
- scale = new Node();\r
- position.attachChild(rotate);\r
- rotate.attachChild(scale);\r
- position.setRenderQueueMode(Renderer.QUEUE_TRANSPARENT);\r
- }\r
-\r
- public void update(Tuple3d position, Tuple3d cameraPosition, JmeRenderingComponent component) {\r
- setPosition(position);\r
- com.jme.math.Vector3f p = VecmathJmeTools.get(position);\r
- p.subtractLocal(VecmathJmeTools.get(cameraPosition));\r
- rotate.getLocalRotation().inverse().multLocal(p);\r
- if (component.getProjectionPolicy() == JmeRenderingComponent.PERSPECTIVE_PROJECTION) {\r
-\r
- double distance = p.length();\r
- // (bug caused in Xith->JME translation ?)\r
- p.negateLocal();\r
- double fov = component.getFieldOfView();\r
- float s = (float) (Math.sin(fov) * distance * 0.1); // scaling factor was 0.2 with Xith\r
- s *= (float)userScale;\r
- Vector3f scale = new Vector3f(1.f, 1.f, 1.f);\r
- \r
- if (p.x > 0.f)\r
- scale.x = -1.f;\r
- if (p.y > 0.f)\r
- scale.y = -1.f;\r
- if (p.z > 0.f)\r
- scale.z = -1.f;\r
- scale.scale(s);\r
- setScale(scale);\r
- } else {\r
- Vector3f scale = new Vector3f(1.f, 1.f, 1.f);\r
- float s = component.getScreenScale() / 5.f;\r
- s *= (float)userScale;\r
- if (p.x > 0.f)\r
- scale.x = -1.f;\r
- if (p.y > 0.f)\r
- scale.y = -1.f;\r
- if (p.z > 0.f)\r
- scale.z = -1.f;\r
- scale.scale(s);\r
- setScale(scale);\r
-\r
- }\r
- }\r
-\r
- public void update(Tuple3d cameraPosition, JmeRenderingComponent component) {\r
-\r
- com.jme.math.Vector3f p = VecmathJmeTools.get(getPosition());\r
- p.subtractLocal(VecmathJmeTools.get(cameraPosition));\r
- rotate.getLocalRotation().inverse().multLocal(p);\r
- if (component.getProjectionPolicy() == JmeRenderingComponent.PERSPECTIVE_PROJECTION) {\r
-\r
- double distance = p.length();\r
- double fov = component.getFieldOfView();\r
- float s = (float)(Math.sin(fov) * distance * 0.1); // scaling factor was 0.2 with Xith\r
- s *= (float)userScale;\r
- Vector3f scale = new Vector3f(1.f,1.f,1.f);\r
- if (p.x > 0.f)\r
- scale.x = -1.f;\r
- if (p.y > 0.f)\r
- scale.y = -1.f;\r
- if (p.z > 0.f)\r
- scale.z = -1.f;\r
- scale.scale(s);\r
- setScale(scale);\r
- } else {\r
- \r
- Vector3f scale = new Vector3f(1.f,1.f,1.f);\r
- float s = component.getScreenScale()/5.f;\r
- s *= (float)userScale;\r
- if (p.x > 0.f)\r
- scale.x = -1.f;\r
- if (p.y > 0.f)\r
- scale.y = -1.f;\r
- if (p.z > 0.f)\r
- scale.z = -1.f;\r
- scale.scale(s);\r
- setScale(scale);\r
- \r
- }\r
- }\r
- \r
- protected void setCoordinate(float array[], int index, Tuple3f c) {\r
- index *= 3;\r
- array[index++] = c.x;\r
- array[index++] = c.y;\r
- array[index] = c.z;\r
- }\r
- \r
- protected void setColor(float array[], int index, Color4f c) {\r
- index *= 4;\r
- array[index++] = c.x;\r
- array[index++] = c.y;\r
- array[index++] = c.z;\r
- array[index] = c.w;\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.gizmo;\r
-\r
-import com.jme.scene.Node;\r
-\r
-/**\r
- * Interface for gizmos, interactive components in the scene-graph.\r
- * \r
- * @author Marko Luukkainen <Marko.Luukkainen@vtt.fi>\r
- *\r
- */\r
-public interface Gizmo {\r
-\r
- /**\r
- * Must return unique identifier for this gizmo\r
- * @return\r
- */\r
- public abstract String getPickPrefix();\r
-\r
- /**\r
- * Sets selected component (where mouse is hovering) by using its name.\r
- * Name includes pick prefix\r
- * @param name\r
- */\r
- public abstract void setSelected(String name);\r
-\r
- /**\r
- * Returns root-node of the gizmo. It is used for inserting the gizmo into scenegraph.\r
- * @return\r
- */\r
- public abstract Node getNode();\r
- \r
- /**\r
- * Returns true if gizmo needs to be redrawn.\r
- * @return\r
- */\r
- public boolean isChanged();\r
- \r
- public void setChanged(boolean b);\r
-\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.gizmo;\r
-\r
-import java.nio.FloatBuffer;\r
-\r
-import javax.vecmath.Color4f;\r
-\r
-import org.simantics.proconf.g3d.base.VecmathJmeTools;\r
-\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.scene.TriMesh;\r
-import com.jme.util.geom.BufferUtils;\r
-\r
-\r
-\r
-public abstract class MultiSelectionGizmo extends AbstractGizmo {\r
- \r
- public static final int UNSELECTED = 0;\r
- public static final int SELECTED = 1;\r
-\r
- private TriMesh geoms[] = new TriMesh[4];\r
- private ColorRGBA colors[][] = new ColorRGBA[4][2];\r
- \r
-\r
- private boolean selected[];\r
- \r
- \r
- private int selectedIndex = -1;\r
- \r
- \r
- public MultiSelectionGizmo() {\r
- super();\r
-\r
- colors = new ColorRGBA[getCount()][2];\r
- geoms = new TriMesh[getCount()];\r
- selected = new boolean[getCount()];\r
- for (int i = 0; i < selected.length; i++) {\r
- selected[i] = false;\r
- }\r
- }\r
- \r
- protected abstract int getCount();\r
- protected abstract int getIndexForName(String name);\r
- \r
- public int getSelected() {\r
- return selectedIndex;\r
- }\r
- \r
- private void updateColor(int index, int selected) {\r
-\r
- FloatBuffer buff = geoms[index].getColorBuffer(0);\r
- for (int i = 0; i < geoms[index].getBatch(0).getVertexCount(); i++) {\r
- BufferUtils.setInBuffer(colors[index][selected], buff, i);\r
- }\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.proconf.shapeeditor.common.Gizmo#changeSelected(java.lang.String)\r
- */\r
- public void setSelected(String name) {\r
- \r
- if (name == null) {\r
- for (int j = 0; j < getCount(); j++) {\r
- if (selected[j]) {\r
- selected[j] = false;\r
- updateColor(j,UNSELECTED);\r
- setChanged(true);\r
- }\r
- }\r
- selectedIndex = -1;\r
- return;\r
- }\r
- int index = getIndexForName(name);\r
- if (index == -1)\r
- return;\r
- selectedIndex = index;\r
- if (!selected[index]) {\r
- selected[index] = true;\r
- updateColor(index,SELECTED);\r
- setChanged(true);\r
- }\r
- for (int j = 0; j < getCount(); j++) {\r
- if (j != index) {\r
- if (selected[j]) {\r
- selected[j] = false;\r
- updateColor(j,UNSELECTED);\r
- setChanged(true);\r
- }\r
- }\r
- } \r
- }\r
- \r
- \r
- protected void setGeometry(int index, TriMesh geom) {\r
- geoms[index] = geom;\r
- }\r
- \r
- protected void setColor(int index, int selected, Color4f color) {\r
- colors[index][selected] = VecmathJmeTools.get(color);\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.gizmo;\r
-\r
-import javax.vecmath.Color4f;\r
-import javax.vecmath.Point3f;\r
-\r
-import com.jme.bounding.BoundingBox;\r
-import com.jme.renderer.Renderer;\r
-import com.jme.scene.TriMesh;\r
-import com.jme.scene.state.AlphaState;\r
-import com.jme.scene.state.MaterialState;\r
-import com.jme.scene.state.ZBufferState;\r
-import com.jme.util.geom.BufferUtils;\r
-\r
-\r
-\r
-public class RotateGizmo extends MultiSelectionGizmo {\r
-\r
- \r
- public static String PICK_NAME = "rotate";\r
- public static String X_NAME = "rx";\r
- public static String Y_NAME = "ry";\r
- public static String Z_NAME = "rz";\r
- public static String XYZ_NAME = "ra";\r
- \r
- public static final int X = 0;\r
- public static final int Y = 1;\r
- public static final int Z = 2;\r
- public static final int XYZ = 3;\r
- \r
-\r
- \r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.proconf.shapeeditor.common.Gizmo#getPickPrefix()\r
- */\r
- public String getPickPrefix() {\r
- return PICK_NAME;\r
- }\r
- \r
- public int getIndexForName(String name) {\r
- if (!name.startsWith(PICK_NAME)) {\r
- return -1;\r
- }\r
- name = name.substring(PICK_NAME.length());\r
- if (name.startsWith(X_NAME))\r
- return X;\r
- if (name.startsWith(Y_NAME))\r
- return Y;\r
- if (name.startsWith(Z_NAME))\r
- return Z;\r
- if (name.startsWith(XYZ_NAME))\r
- return XYZ;\r
- return -1;\r
- }\r
- \r
-\r
- @Override\r
- public int getCount() {\r
- return 4;\r
- }\r
-\r
- public RotateGizmo(Renderer renderer) {\r
- super();\r
- float radius = 2.f;\r
- float radius2 = 1.8f;\r
- int div = 9;\r
- \r
- float x[] = new float[div+1];\r
- float y[] = new float[div+1];\r
- float x2[] = new float[div+1];\r
- float y2[] = new float[div+1];\r
- x[0] = radius;\r
- y[0] = 0.f;\r
- x[div] = 0.f;\r
- y[div] = radius;\r
- x2[0] = radius2;\r
- y2[0] = 0.f;\r
- x2[div] = 0.f;\r
- y2[div] = radius2;\r
- \r
- for (int i = 1; i < div; i++) {\r
- float angle = (float)i/(float)div;\r
- angle *= Math.PI * 0.5f;\r
- float c = (float)Math.cos(angle);\r
- float s = (float)Math.sin(angle);\r
- x[i] = radius * c;\r
- y[i] = radius * s;\r
- x2[i] = radius2 * c;\r
- y2[i] = radius2 * s;\r
-\r
- }\r
- \r
- Color4f colorx = new Color4f(0.5f,0.f,0.f,0.5f);\r
- Color4f colory = new Color4f(0.f,0.5f,0.f,0.5f);\r
- Color4f colorz = new Color4f(0.f,0.f,0.5f,0.5f);\r
- Color4f scolorx = new Color4f(1.f,0.f,0.f,0.7f);\r
- Color4f scolory = new Color4f(0.f,1.f,0.f,0.7f);\r
- Color4f scolorz = new Color4f(0.f,0.f,1.f,0.7f);\r
-\r
- \r
- Color4f colorxyz = new Color4f();\r
- colorxyz.x = colorx.x + colory.x + colorz.x;\r
- colorxyz.y = colorx.y + colory.y + colorz.y;\r
- colorxyz.z = colorx.z +colory.z + colorz.z;\r
- colorxyz.w = 0.5f;\r
- \r
- Color4f scolorxyz = new Color4f();\r
- scolorxyz.x = scolorx.x + scolory.x + scolorz.x;\r
- scolorxyz.y = scolorx.y + scolory.y + scolorz.y;\r
- scolorxyz.z = scolorx.z + scolory.z + scolorz.z;\r
- scolorxyz.w = 0.5f;\r
- \r
- int numVertices = div*2;\r
- float coordinates[] = new float[numVertices*3 + numVertices*3];\r
- float cols[] = new float[numVertices*4*2];\r
- int[] indices = new int[numVertices*3-6+numVertices*3 - 12];\r
- for (int i = 0; i < div; i++) {\r
- if (i == 0) {\r
- indices[0] = 0;\r
- indices[1] = 1;\r
- indices[2] = 2;\r
- continue;\r
- }\r
- int vIndex = i * 2 - 1;\r
- int index = i * 6 - 3;\r
- if (i == div - 1) {\r
- indices[index] = vIndex;\r
- indices[index+1] = vIndex+1;\r
- indices[index+2] = vIndex+2;\r
- \r
- } else {\r
- indices[index] = vIndex;\r
- indices[index+1] = vIndex+1;\r
- indices[index+2] = vIndex+2;\r
- indices[index+3] = vIndex+1;\r
- indices[index+4] = vIndex+3;\r
- indices[index+5] = vIndex+2;\r
- }\r
- }\r
- \r
- for (int i = div+1; i < div * 2 - 1; i++) {\r
- int vIndex = i * 2 - 1;\r
- int index = i * 6 - 12;\r
-\r
- indices[index] = vIndex;\r
- indices[index+1] = vIndex+1;\r
- indices[index+2] = vIndex+2;\r
- indices[index+3] = vIndex+1;\r
- indices[index+4] = vIndex+3;\r
- indices[index+5] = vIndex+2;\r
- }\r
- \r
- for (int i = 0; i < numVertices*2; i++)\r
- setColor(cols,i, colorx);\r
- \r
- setCoordinate(coordinates,0, new Point3f(0.f, x[0], 0.f));\r
- for (int i = 1; i < div; i++) {\r
- int index = i * 2 - 1;\r
- setCoordinate(coordinates,index,new Point3f(0.f,x[i],y[i]));\r
- setCoordinate(coordinates,index+1,new Point3f(y[1],x[i],y[i])); \r
- }\r
- setCoordinate(coordinates,numVertices - 1, new Point3f(0.f, 0.f, y[div]));\r
- \r
- setCoordinate(coordinates,numVertices, new Point3f(0.f, x2[0], 0.f));\r
- for (int i = 1; i < div; i++) {\r
- int index = (div+i) * 2 - 1;\r
- setCoordinate(coordinates,index,new Point3f(y[1],x[i],y[i]));\r
- setCoordinate(coordinates,index+1,new Point3f(y2[1],x2[i],y2[i])); \r
- }\r
- setCoordinate(coordinates,numVertices*2 - 1, new Point3f(0.f, 0.f, y2[div]));\r
- \r
- TriMesh linex = new TriMesh(PICK_NAME+X_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
- \r
- \r
- for (int i = 0; i < numVertices*2; i++)\r
- setColor(cols,i, colory);\r
- \r
- setCoordinate(coordinates,0, new Point3f(x[0], 0.f, 0.f));\r
- for (int i = 1; i < div; i++) {\r
- int index = i * 2 - 1;\r
- setCoordinate(coordinates,index,new Point3f(x[i],0.f,y[i]));\r
- setCoordinate(coordinates,index+1,new Point3f(x[i],y[1],y[i])); \r
- }\r
- setCoordinate(coordinates,numVertices - 1, new Point3f(0.f, 0.f, y[div]));\r
- \r
- setCoordinate(coordinates,numVertices, new Point3f(x2[0], 0.f, 0.f));\r
- for (int i = 1; i < div; i++) {\r
- int index = (div+i) * 2 - 1;\r
- setCoordinate(coordinates,index,new Point3f(x[i],y[1],y[i]));\r
- setCoordinate(coordinates,index+1,new Point3f(x2[i],y2[1],y2[i])); \r
- }\r
- setCoordinate(coordinates,numVertices*2 - 1, new Point3f(0.f, 0.f, y2[div]));\r
-\r
- TriMesh liney = new TriMesh(PICK_NAME+Y_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
- \r
- \r
- for (int i = 0; i < numVertices*2; i++)\r
- setColor(cols,i, colorz);\r
- \r
- setCoordinate(coordinates,0, new Point3f(0.f, x[0], 0.f));\r
- for (int i = 1; i < div; i++) {\r
- int index = i * 2 - 1;\r
- setCoordinate(coordinates,index,new Point3f(y[i],x[i],0.f));\r
- setCoordinate(coordinates,index+1,new Point3f(y[i],x[i],y[1])); \r
- }\r
- setCoordinate(coordinates,numVertices - 1, new Point3f(y[div],0.f, 0.f));\r
-\r
- setCoordinate(coordinates,numVertices, new Point3f(0.f, x2[0], 0.f));\r
- for (int i = 1; i < div; i++) {\r
- int index = (div+i) * 2 - 1;\r
- setCoordinate(coordinates,index,new Point3f(y[i],x[i],y[1]));\r
- setCoordinate(coordinates,index+1,new Point3f(y2[i],x2[i],y2[1])); \r
- }\r
- setCoordinate(coordinates,numVertices*2 - 1, new Point3f(y2[div],0.f, 0.f));\r
-\r
- TriMesh linez = new TriMesh(PICK_NAME+Z_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
- \r
- \r
- numVertices = (div-2)*3+1;\r
- coordinates = new float[numVertices*3];\r
- cols = new float[numVertices*4];\r
- indices = new int[(div-2)*3*3];\r
- \r
- for (int i = 0; i < numVertices; i++)\r
- setColor(cols,i, colorxyz);\r
- float center = radius * 0.5f;//(float)Math.cos(Math.PI*0.25);\r
- setCoordinate(coordinates,0,new Point3f(center,center,center));\r
- for (int i = 1; i < div; i++) {\r
- int index = i;\r
- setCoordinate(coordinates,index,new Point3f(y2[1],x2[i],y2[i]));\r
- }\r
- for (int i = 1; i < div; i++) {\r
- int index = i + div-1 - 1;\r
- setCoordinate(coordinates,index,new Point3f(y2[i],y2[1],x2[i]));\r
- }\r
- for (int i = 1; i < div-1; i++) {\r
- int index = i + 2*(div-1) -2;\r
- setCoordinate(coordinates,index,new Point3f(x2[i],y2[i],y2[1]));\r
- }\r
- for (int i = 0; i < (div-2)*3; i++) {\r
- int index = i*3;\r
- int iindex = i+1;\r
- indices[index] = 0;\r
- indices[index+1] = iindex;\r
- indices[index+2] = iindex+1;\r
- if (iindex == (numVertices -1))\r
- indices[index+2] = 1;\r
- \r
- }\r
-\r
- TriMesh trianglexyz = new TriMesh(PICK_NAME+XYZ_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
- \r
- \r
- getGizmoNode().attachChild(linex);\r
- getGizmoNode().attachChild(liney);\r
- getGizmoNode().attachChild(linez);\r
- getGizmoNode().attachChild(trianglexyz);\r
- getGizmoNode().setModelBound(new BoundingBox());\r
- getGizmoNode().updateModelBound();\r
- \r
- linex.getBatch(0).setCastsShadows(false);\r
- liney.getBatch(0).setCastsShadows(false);\r
- linez.getBatch(0).setCastsShadows(false);\r
- trianglexyz.getBatch(0).setCastsShadows(false);\r
- \r
- setGeometry(0,linex);\r
- setGeometry(1,liney);\r
- setGeometry(2,linez);\r
- setGeometry(3,trianglexyz);\r
- \r
- setColor(0,0,colorx);\r
- setColor(0,1,scolorx);\r
- setColor(1,0,colory);\r
- setColor(1,1,scolory);\r
- setColor(2,0,colorz);\r
- setColor(2,1,scolorz);\r
- setColor(3,0,colorxyz);\r
- setColor(3,1,scolorxyz);\r
- \r
- AlphaState as = renderer.createAlphaState();\r
- as.setBlendEnabled(true);\r
- as.setSrcFunction(AlphaState.DB_SRC_ALPHA);\r
- as.setDstFunction(AlphaState.DB_ONE_MINUS_SRC_ALPHA);\r
- as.setEnabled(true);\r
- getGizmoNode().setRenderState(as);\r
- MaterialState ms = renderer.createMaterialState();\r
- ms.setColorMaterial(MaterialState.CM_AMBIENT_AND_DIFFUSE);\r
- ms.setMaterialFace(MaterialState.MF_FRONT_AND_BACK);\r
- getGizmoNode().setRenderState(ms);\r
- ZBufferState zs = renderer.createZBufferState();\r
- zs.setFunction(ZBufferState.CF_ALWAYS);\r
- zs.setEnabled(true);\r
- getGizmoNode().setRenderState(zs);\r
- \r
- \r
- }\r
-\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.gizmo;\r
-\r
-import javax.vecmath.Color4f;\r
-import javax.vecmath.Point3f;\r
-\r
-import com.jme.bounding.BoundingBox;\r
-import com.jme.renderer.Renderer;\r
-import com.jme.scene.TriMesh;\r
-import com.jme.scene.state.AlphaState;\r
-import com.jme.scene.state.MaterialState;\r
-import com.jme.scene.state.ZBufferState;\r
-import com.jme.util.geom.BufferUtils;\r
-\r
-\r
-public class TransformGizmo extends MultiSelectionGizmo {\r
-\r
- \r
- public static String PICK_NAME = "translate";\r
- public static String X_NAME = "ax";\r
- public static String Y_NAME = "ay";\r
- public static String Z_NAME = "az";\r
- public static String XZ_NAME = "xz";\r
- public static String XY_NAME = "xy";\r
- public static String YZ_NAME = "yz";\r
- public static String XYZ_NAME = "aa";\r
- \r
- public static final int X = 0;\r
- public static final int Y = 1;\r
- public static final int Z = 2;\r
- public static final int XY = 3;\r
- public static final int XZ = 4;\r
- public static final int YZ = 5;\r
- public static final int XYZ = 6;\r
-\r
- \r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.proconf.shapeeditor.common.Gizmo#getPickPrefix()\r
- */\r
- public String getPickPrefix() {\r
- return PICK_NAME;\r
- }\r
- \r
- public int getIndexForName(String name) {\r
- if (!name.startsWith(PICK_NAME)) {\r
- return -1;\r
- }\r
- name = name.substring(PICK_NAME.length());\r
- if (name.startsWith(X_NAME))\r
- return X;\r
- if (name.startsWith(Y_NAME))\r
- return Y;\r
- if (name.startsWith(Z_NAME))\r
- return Z;\r
- if (name.startsWith(XY_NAME))\r
- return XY;\r
- if (name.startsWith(XZ_NAME))\r
- return XZ;\r
- if (name.startsWith(YZ_NAME))\r
- return YZ;\r
- if (name.startsWith(XYZ_NAME))\r
- return XYZ;\r
- return -1;\r
- }\r
- \r
- @Override\r
- public int getCount() {\r
- return 7;\r
- }\r
-\r
- \r
- /*\r
- public TransformGizmo() {\r
- */\r
- public TransformGizmo(Renderer renderer) {\r
- super();\r
- float size = 2.f;\r
- float sizeD2 = 1.f;\r
- float offset = 0.2f;\r
- \r
- Color4f colorx = new Color4f(0.5f,0.f,0.f,0.5f);\r
- Color4f colory = new Color4f(0.f,0.5f,0.f,0.5f);\r
- Color4f colorz = new Color4f(0.f,0.f,0.5f,0.5f);\r
- Color4f scolorx = new Color4f(1.f,0.f,0.f,0.7f);\r
- Color4f scolory = new Color4f(0.f,1.f,0.f,0.7f);\r
- Color4f scolorz = new Color4f(0.f,0.f,1.f,0.7f);\r
- \r
- Color4f colorxy = new Color4f();\r
- colorxy.x = colorx.x + colory.x;\r
- colorxy.y = colorx.y + colory.y;\r
- colorxy.z = colorx.z + colory.z;\r
- colorxy.w = 0.5f;\r
- \r
- Color4f colorxz = new Color4f();\r
- colorxz.x = colorx.x + colorz.x;\r
- colorxz.y = colorx.y + colorz.y;\r
- colorxz.z = colorx.z + colorz.z;\r
- colorxz.w = 0.5f;\r
- \r
- Color4f coloryz = new Color4f();\r
- coloryz.x = colory.x + colorz.x;\r
- coloryz.y = colory.y + colorz.y;\r
- coloryz.z = colory.z + colorz.z;\r
- coloryz.w = 0.5f;\r
- \r
- Color4f colorxyz = new Color4f();\r
- colorxyz.x = colorx.x + colory.x + colorz.x;\r
- colorxyz.y = colorx.y + colory.y + colorz.y;\r
- colorxyz.z = colorx.z +colory.z + colorz.z;\r
- colorxyz.w = 0.5f;\r
- \r
- Color4f scolorxy = new Color4f();\r
- scolorxy.x = scolory.x + scolorx.x;\r
- scolorxy.y = scolory.y + scolorx.y;\r
- scolorxy.z = scolory.z + scolorx.z;\r
- scolorxy.w = 0.5f;\r
- \r
- Color4f scolorxz = new Color4f();\r
- scolorxz.x = scolorx.x + scolorz.x;\r
- scolorxz.y = scolorx.y + scolorz.y;\r
- scolorxz.z = scolorx.z + scolorz.z;\r
- scolorxz.w = 0.5f;\r
- \r
- Color4f scoloryz = new Color4f();\r
- scoloryz.x = scolory.x + scolorz.x;\r
- scoloryz.y = scolory.y + scolorz.y;\r
- scoloryz.z = scolory.z + scolorz.z;\r
- scoloryz.w = 0.5f;\r
- \r
- Color4f scolorxyz = new Color4f();\r
- scolorxyz.x = scolorx.x + scolory.x + scolorz.x;\r
- scolorxyz.y = scolorx.y + scolory.y + scolorz.y;\r
- scolorxyz.z = scolorx.z + scolory.z + scolorz.z;\r
- scolorxyz.w = 0.5f;\r
- \r
- \r
- float coordinates[] = new float[6*3];\r
- float cols[] = new float[6*4];\r
- int[] indices = new int[]{0,1,3,\r
- 1,2,3,\r
- 0,3,5,\r
- 3,4,5};\r
- for (int i = 0; i < 6; i++)\r
- setColor(cols,i, colorx);\r
-\r
- setCoordinate(coordinates,0, new Point3f(size, 0.f, 0.f));\r
- setCoordinate(coordinates,1, new Point3f(size - offset, offset, 0.f));\r
- setCoordinate(coordinates,2, new Point3f(sizeD2 - offset, offset, 0.f));\r
- setCoordinate(coordinates,3, new Point3f(sizeD2, 0.f, 0.f));\r
- setCoordinate(coordinates,4, new Point3f(sizeD2 - offset, 0.f, offset));\r
- setCoordinate(coordinates,5, new Point3f(size - offset, 0.f, offset));\r
-\r
- TriMesh linex = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
- \r
- for (int i = 0; i < 6; i++)\r
- setColor(cols,i, colory);\r
-\r
- setCoordinate(coordinates,0, new Point3f(0.f, size, 0.f));\r
- setCoordinate(coordinates,1, new Point3f(offset, size - offset, 0.f));\r
- setCoordinate(coordinates,2, new Point3f(offset, sizeD2 - offset, 0.f));\r
- setCoordinate(coordinates,3, new Point3f(0.f, sizeD2, 0.f));\r
- setCoordinate(coordinates,4, new Point3f(0.f, sizeD2 - offset, offset));\r
- setCoordinate(coordinates,5, new Point3f(0.f, size - offset, offset));\r
-\r
- TriMesh liney = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
- \r
- for (int i = 0; i < 6; i++)\r
- setColor(cols,i, colorz);\r
-\r
- setCoordinate(coordinates,0, new Point3f(0.f, 0.f,size));\r
- setCoordinate(coordinates,1, new Point3f(offset, 0.f, size - offset));\r
- setCoordinate(coordinates,2, new Point3f(offset, 0.f, sizeD2 - offset));\r
- setCoordinate(coordinates,3, new Point3f(0.f, 0.f, sizeD2));\r
- setCoordinate(coordinates,4, new Point3f(0.f, offset, sizeD2 - offset));\r
- setCoordinate(coordinates,5, new Point3f(0.f, offset, size - offset));\r
-\r
- TriMesh linez = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
- \r
- // TODO : picking did not work properly without chancing indices; this must be investigated \r
- indices = new int[]{2,1,3,0,1,3};//{0,1,3,1,2,3};\r
- coordinates = new float[4*3];\r
- cols = new float[4*4];\r
- \r
- for (int i = 0; i < 4; i++)\r
- setColor(cols,i, colorxz);\r
- setCoordinate(coordinates,0, new Point3f(offset, 0.f, size-offset));\r
- setCoordinate(coordinates,1, new Point3f(offset, 0.f, sizeD2 - offset));\r
- setCoordinate(coordinates,2, new Point3f(sizeD2 - offset, 0.f, offset));\r
- setCoordinate(coordinates,3, new Point3f(size-offset, 0.f, offset));\r
-\r
- TriMesh trianglexz = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
- \r
- for (int i = 0; i < 4; i++)\r
- setColor(cols,i, colorxy);\r
- setCoordinate(coordinates,0, new Point3f(offset, size-offset, 0.f));\r
- setCoordinate(coordinates,1, new Point3f(offset, sizeD2 - offset, 0.f));\r
- setCoordinate(coordinates,2, new Point3f(sizeD2 - offset, offset, 0.f));\r
- setCoordinate(coordinates,3, new Point3f(size-offset, offset, 0.f));\r
-\r
- TriMesh trianglexy = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
- \r
- for (int i = 0; i < 4; i++)\r
- setColor(cols,i, coloryz);\r
- setCoordinate(coordinates,0, new Point3f( 0.f,offset, size-offset));\r
- setCoordinate(coordinates,1, new Point3f( 0.f,offset, sizeD2 - offset));\r
- setCoordinate(coordinates,2, new Point3f( 0.f,sizeD2 - offset, offset));\r
- setCoordinate(coordinates,3, new Point3f( 0.f,size-offset, offset));\r
-\r
- TriMesh triangleyz = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
- \r
- indices = new int[]{0,1,2,\r
- 0,2,3,\r
- 0,3,4,\r
- 0,4,5,\r
- 0,5,6,\r
- 0,6,7,\r
- 0,7,8,\r
- 0,8,9,\r
- 0,9,1};\r
- coordinates = new float[10*3];\r
- cols = new float[10*4];\r
- \r
- for (int i = 0; i < 10; i++)\r
- setColor(cols,i, colorxyz);\r
- setCoordinate(coordinates,0, new Point3f(0.f, 0.f, 0.f));\r
- setCoordinate(coordinates,1, new Point3f(sizeD2, 0.f, 0.f));\r
- setCoordinate(coordinates,2, new Point3f(sizeD2 - offset, offset, 0.f));\r
- setCoordinate(coordinates,3, new Point3f(offset, sizeD2 - offset, 0.f));\r
- setCoordinate(coordinates,4, new Point3f(0.f, sizeD2, 0.f));\r
- setCoordinate(coordinates,5, new Point3f(0.f, sizeD2 - offset, offset));\r
- setCoordinate(coordinates,6, new Point3f(0.f, offset, sizeD2-offset));\r
- setCoordinate(coordinates,7, new Point3f(0.f, 0.f, sizeD2));\r
- setCoordinate(coordinates,8, new Point3f(offset, 0.f, sizeD2-offset));\r
- setCoordinate(coordinates,9, new Point3f(sizeD2-offset, 0.f, offset));\r
- \r
- TriMesh trianglexyz = new TriMesh("",BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
- \r
- linex.setName(PICK_NAME+X_NAME);\r
- liney.setName(PICK_NAME+Y_NAME);\r
- linez.setName(PICK_NAME+Z_NAME);\r
- trianglexy.setName(PICK_NAME+XY_NAME);\r
- trianglexz.setName(PICK_NAME+XZ_NAME);\r
- triangleyz.setName(PICK_NAME+YZ_NAME);\r
- trianglexyz.setName(PICK_NAME+XYZ_NAME);\r
- \r
- linex.getBatch(0).setCastsShadows(false);\r
- liney.getBatch(0).setCastsShadows(false);\r
- linez.getBatch(0).setCastsShadows(false);\r
- trianglexy.getBatch(0).setCastsShadows(false);\r
- trianglexz.getBatch(0).setCastsShadows(false);\r
- triangleyz.getBatch(0).setCastsShadows(false);\r
- trianglexyz.getBatch(0).setCastsShadows(false);\r
-\r
- getGizmoNode().attachChild(linex);\r
- getGizmoNode().attachChild(liney);\r
- getGizmoNode().attachChild(linez);\r
- getGizmoNode().attachChild(trianglexy);\r
- getGizmoNode().attachChild(trianglexz);\r
- getGizmoNode().attachChild(triangleyz);\r
- getGizmoNode().attachChild(trianglexyz);\r
- getGizmoNode().setModelBound(new BoundingBox());\r
- getGizmoNode().updateModelBound();\r
-\r
- setGeometry(0,linex);\r
- setGeometry(1,liney);\r
- setGeometry(2,linez);\r
- setGeometry(3,trianglexy);\r
- setGeometry(4,trianglexz);\r
- setGeometry(5,triangleyz);\r
- setGeometry(6,trianglexyz);\r
- \r
- \r
- setColor(0,0,colorx);\r
- setColor(0,1,scolorx);\r
- setColor(1,0,colory);\r
- setColor(1,1,scolory);\r
- setColor(2,0,colorz);\r
- setColor(2,1,scolorz);\r
- setColor(3,0,colorxy);\r
- setColor(3,1,scolorxy);\r
- setColor(4,0,colorxz);\r
- setColor(4,1,scolorxz);\r
- setColor(5,0,coloryz);\r
- setColor(5,1,scoloryz);\r
- setColor(6,0,colorxyz);\r
- setColor(6,1,scolorxyz);\r
- \r
-\r
- AlphaState as = renderer.createAlphaState(); \r
- as.setBlendEnabled(true);\r
- as.setSrcFunction(AlphaState.DB_SRC_ALPHA);\r
- as.setDstFunction(AlphaState.DB_ONE_MINUS_SRC_ALPHA);\r
- as.setEnabled(true);\r
- getGizmoNode().setRenderState(as);\r
- MaterialState ms = renderer.createMaterialState();\r
- ms.setColorMaterial(MaterialState.CM_AMBIENT_AND_DIFFUSE);\r
- ms.setMaterialFace(MaterialState.MF_FRONT_AND_BACK);\r
- getGizmoNode().setRenderState(ms);\r
- ZBufferState zs = renderer.createZBufferState();\r
- zs.setFunction(ZBufferState.CF_ALWAYS);\r
- zs.setEnabled(true);\r
- zs.setWritable(false);\r
- getGizmoNode().setRenderState(zs);\r
- }\r
-\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.gizmo;\r
-\r
-import java.nio.FloatBuffer;\r
-\r
-import javax.vecmath.Color4f;\r
-import javax.vecmath.Point3f;\r
-import javax.vecmath.Vector3f;\r
-\r
-import org.simantics.proconf.g3d.base.VecmathJmeTools;\r
-\r
-import com.jme.bounding.BoundingBox;\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.renderer.Renderer;\r
-import com.jme.scene.TriMesh;\r
-import com.jme.scene.state.AlphaState;\r
-import com.jme.scene.state.MaterialState;\r
-import com.jme.scene.state.ZBufferState;\r
-import com.jme.util.geom.BufferUtils;\r
-\r
-\r
-public class TransformInlineGizmo extends AbstractGizmo {\r
-\r
- TriMesh geom = new TriMesh();\r
- ColorRGBA colors[] = new ColorRGBA[2];\r
- \r
- \r
- public static String PICK_NAME = "translate";\r
- public static String X_NAME = "ax";\r
- \r
- public static final int X = 0;\r
- \r
- public static final int SELECTED = 1;\r
- public static final int UNSELECTED = 0;\r
- \r
- private boolean selected = false;\r
- \r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.proconf.shapeeditor.common.Gizmo#getPickPrefix()\r
- */\r
- public String getPickPrefix() {\r
- return PICK_NAME;\r
- }\r
- \r
- public int getIndexForName(String name) {\r
- if (!name.startsWith(PICK_NAME)) {\r
- return -1;\r
- }\r
- name = name.substring(PICK_NAME.length());\r
- if (name.startsWith(X_NAME))\r
- return X;\r
- return -1;\r
- }\r
- \r
- private void updateColor(int sel) {\r
- FloatBuffer buff = geom.getColorBuffer(0);\r
- for (int i = 0; i < geom.getBatch(0).getVertexCount(); i++) {\r
- BufferUtils.setInBuffer(colors[sel], buff, i);\r
- }\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.proconf.shapeeditor.common.Gizmo#changeSelected(java.lang.String)\r
- */\r
- public void setSelected(String name) {\r
- \r
- if (name == null) {\r
- setChanged(true);\r
- updateColor(UNSELECTED);\r
- selected = false;\r
- return;\r
- }\r
- int index = getIndexForName(name);\r
- if (index == -1) {\r
- selected = false;\r
- return;\r
- }\r
-\r
- selected = true;\r
- updateColor(SELECTED);\r
- setChanged(true);\r
- \r
- }\r
- \r
- @Override\r
- public void setScale(Vector3f scale) {\r
- /**\r
- * A bug in JME (?)\r
- * Negative scaling breaks picking (ray hits the bounding box, but ray doesn't intersect any triangles) \r
- */\r
- scale.x = Math.abs(scale.x);\r
- scale.y = Math.abs(scale.y);\r
- scale.z = Math.abs(scale.z);\r
- \r
- super.setScale(scale);\r
- }\r
- \r
- \r
- /*\r
- public TransformInlineGizmo(){\r
- */\r
- public TransformInlineGizmo(Renderer renderer) {\r
- super();\r
- float size = 2.f;\r
- float sizeD2 = 1.f;\r
- float offset = 0.07f;\r
- \r
- Color4f colorx = new Color4f(0.5f,0.f,0.f,0.5f);\r
- Color4f scolorx = new Color4f(1.f,0.f,0.f,0.7f);\r
- \r
-\r
- float coordinates[] = new float[18*3];\r
- float cols[] = new float[18*4];\r
- int[] indices = new int[]{0,2,1,\r
- 0,3,2,\r
- 0,4,3,\r
- 0,1,4,\r
- 1,2,6,\r
- 1,6,5,\r
- 2,3,7,\r
- 2,7,6,\r
- 3,4,8,\r
- 3,8,7,\r
- 4,1,5,\r
- 4,5,8,\r
- 5,6,7,\r
- 5,7,8,\r
- \r
- 9,11,10,\r
- 9,12,11,\r
- 9,13,12,\r
- 9,10,13,\r
- 10,11,15,\r
- 10,15,14,\r
- 11,12,16,\r
- 11,16,15,\r
- 12,13,17,\r
- 12,17,16,\r
- 13,10,14,\r
- 13,14,17,\r
- 14,15,16,\r
- 14,16,17\r
- \r
- };\r
- for (int i = 0; i < 18; i++)\r
- setColor(cols,i, colorx);\r
-\r
- setCoordinate(coordinates,0, new Point3f(size, 0.f, 0.f));\r
- setCoordinate(coordinates,1, new Point3f(size - offset*2, offset, offset));\r
- setCoordinate(coordinates,2, new Point3f(size - offset*2, offset, -offset));\r
- setCoordinate(coordinates,3, new Point3f(size - offset*2, -offset, -offset));\r
- setCoordinate(coordinates,4, new Point3f(size - offset*2, -offset, offset));\r
- setCoordinate(coordinates,5, new Point3f(sizeD2, offset, offset));\r
- setCoordinate(coordinates,6, new Point3f(sizeD2, offset, -offset));\r
- setCoordinate(coordinates,7, new Point3f(sizeD2, -offset, -offset));\r
- setCoordinate(coordinates,8, new Point3f(sizeD2, -offset, offset));\r
- \r
- setCoordinate(coordinates,9, new Point3f(-size, 0.f, 0.f));\r
- setCoordinate(coordinates,10, new Point3f(-size + offset*2, offset, offset));\r
- setCoordinate(coordinates,11, new Point3f(-size + offset*2, offset, -offset));\r
- setCoordinate(coordinates,12, new Point3f(-size + offset*2, -offset, -offset));\r
- setCoordinate(coordinates,13, new Point3f(-size + offset*2, -offset, offset));\r
- setCoordinate(coordinates,14, new Point3f(-sizeD2, offset, offset));\r
- setCoordinate(coordinates,15, new Point3f(-sizeD2, offset, -offset));\r
- setCoordinate(coordinates,16, new Point3f(-sizeD2, -offset, -offset));\r
- setCoordinate(coordinates,17, new Point3f(-sizeD2, -offset, offset));\r
-\r
- TriMesh linex = new TriMesh(PICK_NAME+X_NAME,BufferUtils.createFloatBuffer(coordinates),null,BufferUtils.createFloatBuffer(cols),null,BufferUtils.createIntBuffer(indices));\r
- \r
- getGizmoNode().attachChild(linex);\r
- getGizmoNode().setModelBound(new BoundingBox());\r
- getGizmoNode().updateModelBound();\r
-\r
- geom = linex;\r
- geom.getBatch(0).setCastsShadows(false);\r
-\r
- colors[0] = VecmathJmeTools.get(colorx);\r
- colors[1] = VecmathJmeTools.get(scolorx);\r
- \r
- AlphaState as = renderer.createAlphaState();\r
- as.setBlendEnabled(true);\r
- as.setSrcFunction(AlphaState.DB_SRC_ALPHA);\r
- as.setDstFunction(AlphaState.DB_ONE_MINUS_SRC_ALPHA);\r
- as.setEnabled(true);\r
- getGizmoNode().setRenderState(as);\r
- MaterialState ms = renderer.createMaterialState();\r
- ms.setColorMaterial(MaterialState.CM_AMBIENT_AND_DIFFUSE);\r
- ms.setMaterialFace(MaterialState.MF_FRONT_AND_BACK);\r
- getGizmoNode().setRenderState(ms);\r
- ZBufferState zs = renderer.createZBufferState();\r
- zs.setFunction(ZBufferState.CF_ALWAYS);\r
- zs.setEnabled(true);\r
- getGizmoNode().setRenderState(zs);\r
- \r
- }\r
- \r
-\r
- public boolean isSelected() {\r
- return selected;\r
- }\r
-\r
- public void setSelected(boolean selected) {\r
- this.selected = selected;\r
- }\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.input;\r
-\r
-import java.awt.event.KeyEvent;\r
-import java.awt.event.KeyListener;\r
-import java.awt.event.MouseEvent;\r
-import java.awt.event.MouseListener;\r
-import java.awt.event.MouseMotionListener;\r
-\r
-public class AWTInputProvider implements KeyListener, MouseListener, MouseMotionListener , InputProvider{\r
- \r
- private boolean keyPressed[] = new boolean[1024];\r
- private boolean keyTemp[] = new boolean[1024];\r
- private boolean keyDown[] = new boolean[1024];\r
- private boolean keyUp[] = new boolean[1024];\r
- \r
- private int awtMouseX = 0;\r
- private int awtMouseY = 0;\r
- private boolean awtPressed = false;\r
- private boolean awtDragged = false;\r
- private boolean awtReleased = false;\r
- private boolean awtMouseClicked = false;\r
- private boolean awtMouseMoved = false;\r
- \r
- private int awtPressModifiers = 0;\r
- private int awtDragModifiers = 0;\r
- private int awtClickModifiers = 0;\r
- private int awtMoveModifiers = 0;\r
- private int awtClickButton = 0;\r
- \r
- private int mouseX = 0;\r
- private int mouseY = 0;\r
- \r
- private int prevMouseX = 0;\r
- private int prevMouseY = 0;\r
- \r
- private boolean mousePressed = false;\r
- private boolean mouseDragged = false;\r
- private boolean mouseReleased = false;\r
- private boolean mouseClicked = false;\r
- private boolean mouseMoved = false;\r
- \r
- private int pressModifiers = 0;\r
- private int clickModifiers = 0;\r
- private int dragModifiers = 0;\r
- private int clickButton = 0;\r
- private int moveModifiers = 0;\r
- \r
- public AWTInputProvider() {\r
- for (int i = 0; i < keyDown.length; i++) {\r
- keyDown[i] = false;\r
- keyTemp[i] = false;\r
- keyPressed[i] = false; \r
- keyUp[i] = false;\r
- }\r
- }\r
- \r
- public boolean keyPressed(int i) {\r
- return keyPressed[i];\r
- }\r
- \r
- public boolean keyDown(int i) {\r
- return keyDown[i];\r
- }\r
- \r
- public boolean keyUp(int i) {\r
- return keyUp[i];\r
- }\r
- \r
- public int mouseX() {\r
- return mouseX;\r
- }\r
- \r
- public int mouseY() {\r
- return mouseY;\r
- }\r
- \r
- public int prevMouseX() {\r
- return prevMouseX;\r
- }\r
- \r
- public int prevMouseY() {\r
- return prevMouseY;\r
- }\r
- \r
- public boolean mousePressed() {\r
- return mousePressed;\r
- }\r
- \r
- public boolean mouseMoved() {\r
- return mouseMoved;\r
- }\r
- \r
- public boolean mouseReleased() {\r
- return mouseReleased;\r
- }\r
- \r
- public boolean mouseClicked() {\r
- return mouseClicked;\r
- }\r
- \r
- public boolean mouseDragged() {\r
- return mouseDragged;\r
- }\r
- \r
- public int pressModifiers() {\r
- return pressModifiers;\r
- }\r
- \r
- public int clickModifiers() {\r
- return clickModifiers;\r
- }\r
- \r
- public int dragModifiers() {\r
- return dragModifiers;\r
- }\r
- \r
- public int moveModifiers() {\r
- return moveModifiers;\r
- }\r
- \r
- public int clickButton() {\r
- return clickButton;\r
- }\r
- \r
- \r
- public void update() {\r
- prevMouseX = mouseX;\r
- prevMouseY = mouseY;\r
- mouseX = awtMouseX;\r
- mouseY = awtMouseY;\r
- //System.out.println(mouseX + " " + mouseY);\r
- mousePressed = awtPressed;\r
- awtPressed = false;\r
- mouseReleased = awtReleased;\r
- awtReleased = false;\r
- mouseMoved = awtMouseMoved;\r
- awtMouseMoved = false;\r
- mouseDragged = awtDragged;\r
- awtDragged = false;\r
- mouseClicked = awtMouseClicked;\r
- awtMouseClicked = false;\r
- pressModifiers = awtPressModifiers;\r
- // awtPressModifiers = 0;\r
- clickModifiers = awtClickModifiers;\r
- //awtClickModifiers = 0;\r
- dragModifiers = awtDragModifiers;\r
- // awtDragModifiers = 0;\r
- moveModifiers = awtMoveModifiers;\r
- //awtMoveModifiers = 0;\r
- clickButton = awtClickButton;\r
- awtClickButton = 0;\r
- for (int i = 0; i < keyDown.length; i++) {\r
- if (keyDown[i] && !keyTemp[i]) {\r
- keyTemp[i] = true;\r
- keyPressed[i] = true;\r
- }\r
- else if (keyDown[i] && keyTemp[i]) {\r
- keyPressed[i] = false;\r
- }\r
- else if (!keyDown[i] && keyTemp[i]) {\r
- keyUp[i] = true;\r
- keyTemp[i] = false;\r
- keyPressed[i] = false;\r
- }\r
- else if (!keyDown[i]) {\r
- keyTemp[i] = false;\r
- keyPressed[i] = false;\r
- keyUp[i] = false;\r
- }\r
- }\r
- \r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)\r
- */\r
- public void mouseDragged(MouseEvent e) {\r
- awtMouseX = e.getX();\r
- awtMouseY = e.getY();\r
- awtDragged = true;\r
- awtDragModifiers = e.getModifiers() | e.getButton();\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)\r
- */\r
- public void mouseReleased(MouseEvent e) {\r
- awtReleased = true;\r
- //ms.set(msTmp);\r
-\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)\r
- */\r
- public void mouseClicked(MouseEvent e) {\r
-\r
- awtMouseX = e.getX();\r
- awtMouseY = e.getY();\r
- e.getButton();\r
- \r
- awtClickModifiers = e.getModifiersEx();\r
- awtClickButton = e.getButton();\r
- awtMouseClicked = true;\r
-\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)\r
- */\r
- public void mouseEntered(MouseEvent arg0) {\r
-\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)\r
- */\r
- public void mouseExited(MouseEvent arg0) {\r
-\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * \r
- * @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)\r
- */\r
- public void mouseMoved(MouseEvent arg0) {\r
-\r
- awtMouseMoved = true;\r
- awtMouseX = arg0.getX();\r
- awtMouseY = arg0.getY();\r
- awtMoveModifiers = arg0.getModifiersEx();\r
-\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)\r
- */\r
- public void keyPressed(KeyEvent arg0) {\r
- keyDown[arg0.getKeyCode()] = true;\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)\r
- */\r
- public void keyReleased(KeyEvent arg0) {\r
- keyDown[arg0.getKeyCode()] = false;\r
- }\r
- \r
- \r
- /* (non-Javadoc)\r
- * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)\r
- */\r
- public void keyTyped(KeyEvent e) {\r
-\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)\r
- */\r
- public void mousePressed(MouseEvent e) {\r
- awtMouseX = e.getX();\r
- awtMouseY = e.getY();\r
- awtPressed = true;\r
- awtPressModifiers = e.getModifiers() | e.getButton();\r
- }\r
- \r
- public void setMouseMoved(boolean b) {\r
-\r
- }\r
- \r
- public void setMouseX(int x) {\r
-\r
- }\r
- \r
- public void setMouseY(int y) {\r
-\r
- }\r
- \r
- public String toString() {\r
- String s = "";\r
- s += "(" + mouseX + "," + mouseY + ")\n";\r
- s += "Pressed " + mousePressed + "\n";\r
- s += "Released " + mouseReleased + "\n";\r
- s += "Moved " + mouseMoved + "\n";\r
- s += "Dragged " + mouseDragged + "\n";\r
- s += "Clicked " + mouseClicked + "\n";\r
- s += "DragModifiers " + dragModifiers + "\n";\r
- s += "ClickModifiers " + clickModifiers + "\n";\r
- s += "PressModifiers " + pressModifiers + "\n";\r
- return s;\r
- }\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.input;\r
-\r
-\r
-/**\r
- * InputProvider is used to listen inputs from AWT-thread, \r
- * and then input actions can be polled from the provider.\r
- * \r
- * TODO : use methods instead of public members\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public interface InputProvider {\r
- \r
- \r
- \r
- public boolean keyPressed(int i);\r
- \r
- public boolean keyDown(int i);\r
- \r
- public boolean keyUp(int i);\r
- \r
- public int mouseX();\r
- \r
- public int mouseY();\r
- \r
- public int prevMouseX();\r
- \r
- public int prevMouseY();\r
- \r
- public boolean mousePressed();\r
- \r
- public boolean mouseMoved();\r
- \r
- public boolean mouseReleased();\r
- \r
- public boolean mouseClicked();\r
- \r
- public boolean mouseDragged();\r
- \r
- public int pressModifiers();\r
- \r
- public int clickModifiers();\r
- \r
- public int dragModifiers();\r
- \r
- public int moveModifiers();\r
- \r
- public int clickButton();\r
- \r
- \r
- public void update();\r
- \r
- // FIXME : when dnd is used, mouse inputs won't get passed\r
- \r
- public void setMouseX(int x);\r
- public void setMouseY(int y);\r
- public void setMouseMoved(boolean b);\r
- \r
- \r
- \r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.input;\r
-\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.FocusEvent;\r
-import org.eclipse.swt.events.FocusListener;\r
-import org.eclipse.swt.events.KeyEvent;\r
-import org.eclipse.swt.events.KeyListener;\r
-import org.eclipse.swt.events.MouseEvent;\r
-import org.eclipse.swt.events.MouseListener;\r
-import org.eclipse.swt.events.MouseMoveListener;\r
-import org.eclipse.swt.events.MouseTrackListener;\r
-\r
-public class SWTInputProvider implements KeyListener, MouseListener, MouseMoveListener, MouseTrackListener, InputProvider, FocusListener {\r
- \r
- private static final int PRESS_TIME = 200;\r
- \r
- private boolean keyPressed[] = new boolean[1024];\r
- private boolean keyTemp[] = new boolean[1024];\r
- private boolean keyDown[] = new boolean[1024];\r
- private boolean keyUp[] = new boolean[1024];\r
- \r
- private int awtMouseX = 0;\r
- private int awtMouseY = 0;\r
- private boolean awtPressed = false;\r
- private boolean awtDragged = false;\r
- private boolean awtReleased = false;\r
- private boolean awtMouseClicked = false;\r
- private boolean awtMouseMoved = false;\r
- \r
- private boolean swtMouse1Down = false;\r
- private boolean swtMouse2Down = false;\r
- private boolean swtMouse3Down = false;\r
- \r
- long mouse1DownTime = 0;\r
- long mouse2DownTime = 0;\r
- long mouse3DownTime = 0;\r
- \r
- private int awtPressModifiers = 0;\r
- private int awtDragModifiers = 0;\r
- private int awtClickModifiers = 0;\r
- private int awtMoveModifiers = 0;\r
- private int awtClickButton = 0;\r
- \r
- private int mouseX = 0;\r
- private int mouseY = 0;\r
- \r
- private int prevMouseX = 0;\r
- private int prevMouseY = 0;\r
- \r
- private boolean mousePressed = false;\r
- private boolean mouseDragged = false;\r
- private boolean mouseReleased = false;\r
- private boolean mouseClicked = false;\r
- private boolean mouseMoved = false;\r
- \r
- private int pressModifiers = 0;\r
- private int clickModifiers = 0;\r
- private int dragModifiers = 0;\r
- private int clickButton = 0;\r
- private int moveModifiers = 0;\r
- \r
- public SWTInputProvider() {\r
- reset();\r
- }\r
- \r
- private void reset() {\r
- for (int i = 0; i < keyDown.length; i++) {\r
- keyDown[i] = false;\r
- keyTemp[i] = false;\r
- keyPressed[i] = false; \r
- keyUp[i] = false;\r
- }\r
- mousePressed = false;\r
- mouseDragged = false;\r
- mouseReleased = false;\r
- mouseClicked = false;\r
- mouseMoved = false;\r
- \r
- pressModifiers = 0;\r
- clickModifiers = 0;\r
- dragModifiers = 0;\r
- clickButton = 0;\r
- moveModifiers = 0;\r
- }\r
- \r
- public boolean keyPressed(int i) {\r
- return keyPressed[i];\r
- }\r
- \r
- public boolean keyDown(int i) {\r
- return keyDown[i];\r
- }\r
- \r
- public boolean keyUp(int i) {\r
- return keyUp[i];\r
- }\r
- \r
- public int mouseX() {\r
- return mouseX;\r
- }\r
- \r
- public int mouseY() {\r
- return mouseY;\r
- }\r
- \r
- public int prevMouseX() {\r
- return prevMouseX;\r
- }\r
- \r
- public int prevMouseY() {\r
- return prevMouseY;\r
- }\r
- \r
- public boolean mousePressed() {\r
- return mousePressed;\r
- }\r
- \r
- public boolean mouseMoved() {\r
- return mouseMoved;\r
- }\r
- \r
- public boolean mouseReleased() {\r
- return mouseReleased;\r
- }\r
- \r
- public boolean mouseClicked() {\r
- return mouseClicked;\r
- }\r
- \r
- public boolean mouseDragged() {\r
- return mouseDragged;\r
- }\r
- \r
- public int pressModifiers() {\r
- return pressModifiers;\r
- }\r
- \r
- public int clickModifiers() {\r
- return clickModifiers;\r
- }\r
- \r
- public int dragModifiers() {\r
- return dragModifiers;\r
- }\r
- \r
- public int moveModifiers() {\r
- return moveModifiers;\r
- }\r
- \r
- public int clickButton() {\r
- return clickButton;\r
- }\r
- \r
- \r
- public void update() {\r
- prevMouseX = mouseX;\r
- prevMouseY = mouseY;\r
- mouseX = awtMouseX;\r
- mouseY = awtMouseY;\r
- //System.out.println(mouseX + " " + mouseY);\r
- mousePressed = awtPressed;\r
- awtPressed = false;\r
- mouseReleased = awtReleased;\r
- awtReleased = false;\r
- mouseMoved = awtMouseMoved;\r
- awtMouseMoved = false;\r
- mouseDragged = awtDragged;\r
- awtDragged = false;\r
- mouseClicked = awtMouseClicked;\r
- awtMouseClicked = false;\r
- pressModifiers = awtPressModifiers;\r
- // awtPressModifiers = 0;\r
- clickModifiers = awtClickModifiers;\r
- //awtClickModifiers = 0;\r
- dragModifiers = awtDragModifiers;\r
- // awtDragModifiers = 0;\r
- moveModifiers = awtMoveModifiers;\r
- //awtMoveModifiers = 0;\r
- clickButton = awtClickButton;\r
- awtClickButton = 0;\r
- for (int i = 0; i < keyDown.length; i++) {\r
- if (keyDown[i] && !keyTemp[i]) {\r
- keyTemp[i] = true;\r
- keyPressed[i] = true;\r
- }\r
- else if (keyDown[i] && keyTemp[i]) {\r
- keyPressed[i] = false;\r
- }\r
- else if (!keyDown[i] && keyTemp[i]) {\r
- keyUp[i] = true;\r
- keyTemp[i] = false;\r
- keyPressed[i] = false;\r
- }\r
- else if (!keyDown[i]) {\r
- keyTemp[i] = false;\r
- keyPressed[i] = false;\r
- keyUp[i] = false;\r
- }\r
- }\r
- \r
- }\r
- \r
- \r
-\r
-\r
- private int getAWTKeyCode(int swtKeyCode) {\r
- if(swtKeyCode > keyDown.length) {\r
- int keyCode = 0;\r
- switch (swtKeyCode) {\r
- case SWT.CTRL:\r
- keyCode = java.awt.event.KeyEvent.VK_CONTROL;\r
- break;\r
- case SWT.ALT:\r
- keyCode = java.awt.event.KeyEvent.VK_ALT;\r
- break;\r
- \r
- case SWT.SHIFT:\r
- keyCode = java.awt.event.KeyEvent.VK_SHIFT;\r
- break;\r
- case SWT.ARROW_LEFT:\r
- keyCode = java.awt.event.KeyEvent.VK_LEFT;\r
- break;\r
- case SWT.ARROW_RIGHT:\r
- keyCode = java.awt.event.KeyEvent.VK_RIGHT;\r
- break;\r
- case SWT.ARROW_UP:\r
- keyCode = java.awt.event.KeyEvent.VK_UP;\r
- break;\r
- case SWT.ARROW_DOWN:\r
- keyCode = java.awt.event.KeyEvent.VK_DOWN;\r
- break;\r
- case SWT.KEYPAD_0:\r
- keyCode = java.awt.event.KeyEvent.VK_NUMPAD0;\r
- break;\r
- case SWT.KEYPAD_1:\r
- keyCode = java.awt.event.KeyEvent.VK_NUMPAD1;\r
- break;\r
- case SWT.KEYPAD_2:\r
- keyCode = java.awt.event.KeyEvent.VK_NUMPAD2;\r
- break;\r
- case SWT.KEYPAD_3:\r
- keyCode = java.awt.event.KeyEvent.VK_NUMPAD3;\r
- break;\r
- case SWT.KEYPAD_4:\r
- keyCode = java.awt.event.KeyEvent.VK_NUMPAD4;\r
- break;\r
- case SWT.KEYPAD_5:\r
- keyCode = java.awt.event.KeyEvent.VK_NUMPAD5;\r
- break;\r
- case SWT.KEYPAD_6:\r
- keyCode = java.awt.event.KeyEvent.VK_NUMPAD6;\r
- break;\r
- case SWT.KEYPAD_7:\r
- keyCode = java.awt.event.KeyEvent.VK_NUMPAD7;\r
- break;\r
- case SWT.KEYPAD_8:\r
- keyCode = java.awt.event.KeyEvent.VK_NUMPAD8;\r
- break;\r
- case SWT.KEYPAD_9:\r
- keyCode = java.awt.event.KeyEvent.VK_NUMPAD9;\r
- break;\r
- case SWT.KEYPAD_CR:\r
- keyCode = java.awt.event.KeyEvent.VK_ENTER;\r
- break;\r
- case SWT.NUM_LOCK:\r
- keyCode = java.awt.event.KeyEvent.VK_NUM_LOCK;\r
- break;\r
- case SWT.SCROLL_LOCK:\r
- keyCode = java.awt.event.KeyEvent.VK_SCROLL_LOCK;\r
- break;\r
- case SWT.CAPS_LOCK:\r
- keyCode = java.awt.event.KeyEvent.VK_CAPS_LOCK;\r
- break;\r
- case SWT.INSERT:\r
- keyCode = java.awt.event.KeyEvent.VK_INSERT;\r
- break;\r
- case SWT.HOME:\r
- keyCode = java.awt.event.KeyEvent.VK_HOME;\r
- break;\r
- case SWT.END:\r
- keyCode = java.awt.event.KeyEvent.VK_END;\r
- break;\r
- case SWT.PAGE_UP:\r
- keyCode = java.awt.event.KeyEvent.VK_PAGE_UP;\r
- break;\r
- case SWT.PAGE_DOWN:\r
- keyCode = java.awt.event.KeyEvent.VK_PAGE_DOWN;\r
- break;\r
- case SWT.PAUSE:\r
- keyCode = java.awt.event.KeyEvent.VK_PAUSE; \r
- break;\r
- case SWT.BREAK:\r
- keyCode = java.awt.event.KeyEvent.VK_PAUSE; \r
- break;\r
- case SWT.PRINT_SCREEN:\r
- keyCode = java.awt.event.KeyEvent.VK_PRINTSCREEN; \r
- break; \r
- case SWT.HELP:\r
- keyCode = java.awt.event.KeyEvent.VK_HELP;\r
- break;\r
- default :\r
- keyCode = 0;\r
- break;\r
- }\r
- \r
- return keyCode;\r
- } else if (swtKeyCode == 8) {\r
- return java.awt.event.KeyEvent.VK_BACK_SPACE;\r
- }\r
- else if (swtKeyCode >= 97 )\r
- return swtKeyCode - 32;\r
- else\r
- return swtKeyCode;\r
- }\r
-\r
- \r
- /* (non-Javadoc)\r
- * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)\r
- */\r
- public void keyPressed(KeyEvent arg0) {\r
- //System.out.println("KeyPressed " + arg0.character + " " + arg0.keyCode + " " + getAWTKeyCode(arg0.keyCode));\r
- keyDown[getAWTKeyCode(arg0.keyCode)] = true;\r
- }\r
- \r
- /* (non-Javadoc)\r
- * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)\r
- */\r
- public void keyReleased(KeyEvent arg0) {\r
- //System.out.println("KeyReleased " + arg0.character + " " + arg0.keyCode + " " + getAWTKeyCode(arg0.keyCode));\r
- \r
- keyDown[getAWTKeyCode(arg0.keyCode)] = false;\r
- }\r
-\r
- public void mouseMove(MouseEvent e) {\r
- awtMouseX = e.x;\r
- awtMouseY = e.y; \r
- if (swtMouse1Down || swtMouse2Down || swtMouse3Down) {\r
- // comparing times so that drag event won't be send at the time when mouse button was pressed\r
- long time = e.time & 0xFFFFFFFFL;\r
- boolean drag = false;\r
- if (swtMouse1Down) {\r
- drag = time > mouse1DownTime;\r
- } else if (swtMouse2Down) {\r
- drag = time > mouse2DownTime;\r
- } else {\r
- drag = time > mouse3DownTime;\r
- }\r
- if (drag) {\r
- awtDragged = true;\r
- awtDragModifiers = createButtonMask(e);\r
- }\r
- } else {\r
- awtMoveModifiers = createButtonMask(e);\r
- awtMouseMoved = true;\r
- }\r
- }\r
-\r
- public void mouseDoubleClick(MouseEvent e) {\r
- /*\r
- awtMouseClicked = true;\r
- awtClickModifiers = createButtonMask(e);\r
- switch (e.button) {\r
- case 1:\r
- awtClickButton = java.awt.event.MouseEvent.BUTTON1;\r
- break;\r
- case 2:\r
- awtClickButton = java.awt.event.MouseEvent.BUTTON2;\r
- break;\r
- case 3:\r
- awtClickButton = java.awt.event.MouseEvent.BUTTON3;\r
- break;\r
- \r
- }\r
- */\r
- }\r
- \r
- private int createButtonMask(MouseEvent e) {\r
- int mask = 0;\r
- if (swtMouse1Down)\r
- mask |= java.awt.event.MouseEvent.BUTTON1_DOWN_MASK | java.awt.event.MouseEvent.BUTTON1_MASK;\r
- if (swtMouse2Down)\r
- mask |= java.awt.event.MouseEvent.BUTTON2_DOWN_MASK | java.awt.event.MouseEvent.BUTTON2_MASK;\r
- if (swtMouse3Down)\r
- mask |= java.awt.event.MouseEvent.BUTTON3_DOWN_MASK | java.awt.event.MouseEvent.BUTTON3_MASK;\r
- if ((e.stateMask & SWT.CTRL) > 0) \r
- mask |= java.awt.event.MouseEvent.CTRL_DOWN_MASK | java.awt.event.MouseEvent.CTRL_MASK;\r
- if ((e.stateMask & SWT.CTRL) > 0) \r
- mask |= java.awt.event.MouseEvent.ALT_DOWN_MASK | java.awt.event.MouseEvent.ALT_MASK;\r
- \r
- \r
- return mask;\r
- }\r
-\r
- public void mouseDown(MouseEvent e) {\r
- switch (e.button) {\r
- case 1:\r
- swtMouse1Down = true;\r
- mouse1DownTime = e.time & 0xFFFFFFFFL;\r
- break;\r
- case 2:\r
- swtMouse2Down = true;\r
- mouse2DownTime = e.time & 0xFFFFFFFFL;\r
- break;\r
- case 3:\r
- swtMouse3Down = true;\r
- mouse3DownTime = e.time & 0xFFFFFFFFL;\r
- };\r
- \r
- awtPressed = true;\r
- awtPressModifiers = createButtonMask(e);\r
- }\r
-\r
- public void mouseUp(MouseEvent e) {\r
- long mouseUpTime = e.time & 0xFFFFFFFFL;\r
- long delta = 1000;\r
- switch (e.button) {\r
- case 1:\r
- swtMouse1Down = false;\r
- delta = mouseUpTime - mouse1DownTime;\r
- break;\r
- case 2:\r
- swtMouse2Down = false;\r
- delta = mouseUpTime - mouse2DownTime;\r
- break;\r
- case 3:\r
- swtMouse3Down = false;\r
- delta = mouseUpTime - mouse3DownTime;\r
- };\r
- awtReleased = true;\r
- \r
- if (delta < PRESS_TIME) {\r
- awtMouseClicked = true;\r
- awtClickModifiers = createButtonMask(e);\r
- switch (e.button) {\r
- case 1:\r
- awtClickButton = java.awt.event.MouseEvent.BUTTON1;\r
- break;\r
- case 2:\r
- awtClickButton = java.awt.event.MouseEvent.BUTTON2;\r
- break;\r
- case 3:\r
- awtClickButton = java.awt.event.MouseEvent.BUTTON3;\r
- break;\r
- \r
- }\r
- }\r
- }\r
- \r
- \r
- public void mouseEnter(MouseEvent e) {\r
- \r
- }\r
- \r
- public void mouseExit(MouseEvent e) {\r
- awtReleased = false;\r
- awtPressed = false;\r
- swtMouse1Down = false;\r
- swtMouse2Down = false;\r
- swtMouse3Down = false;\r
- \r
- \r
- }\r
- \r
- public void focusGained(FocusEvent e) {\r
-\r
- }\r
- \r
- public void focusLost(FocusEvent e) {\r
- reset();\r
- }\r
- \r
- public void mouseHover(MouseEvent e) {\r
-\r
- }\r
- \r
- public void setMouseMoved(boolean b) {\r
- awtMouseMoved = b;\r
- }\r
- \r
- public void setMouseX(int x) {\r
- awtMouseX = x;\r
- }\r
- \r
- public void setMouseY(int y) {\r
- awtMouseY = y;\r
- }\r
-\r
- public String toString() {\r
- String s = "";\r
- s += "(" + mouseX + "," + mouseY + ")\n";\r
- s += "Pressed " + mousePressed + "\n";\r
- s += "Released " + mouseReleased + "\n";\r
- s += "Moved " + mouseMoved + "\n";\r
- s += "Dragged " + mouseDragged + "\n";\r
- s += "Clicked " + mouseClicked + "\n";\r
- s += "DragModifiers " + dragModifiers + "\n";\r
- s += "ClickModifiers " + clickModifiers + "\n";\r
- s += "PressModifiers " + pressModifiers + "\n";\r
- return s;\r
- }\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.preferences;
-
-import org.eclipse.jface.preference.*;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.IWorkbench;
-import org.simantics.proconf.g3d.Activator;
-
-
-/**
- * This class represents a preference page that
- * is contributed to the Preferences dialog. By
- * subclassing <samp>FieldEditorPreferencePage</samp>, we
- * can use the field support built into JFace that allows
- * us to create a page that is small and knows how to
- * save, restore and apply itself.
- * <p>
- * This page is used to modify preferences only. They
- * are stored in the preference store that belongs to
- * the main plug-in class. That way, preferences can
- * be accessed directly via the preference store.
- */
-
-public class G3DPreferencesPage
- extends FieldEditorPreferencePage
- implements IWorkbenchPreferencePage {
-
- public G3DPreferencesPage() {
- super(GRID);
- setPreferenceStore(Activator.getDefault().getPreferenceStore());
- setDescription("A demonstration of a preference page implementation");
- }
-
- /**
- * Creates the field editors. Field editors are abstractions of
- * the common GUI blocks needed to manipulate various types
- * of preferences. Each field editor knows how to save and
- * restore itself.
- */
- public void createFieldEditors() {
-// addField(new DirectoryFieldEditor(PreferenceConstants.P_PATH,
-// "&Directory preference:", getFieldEditorParent()));
-// addField(
-// new BooleanFieldEditor(
-// PreferenceConstants.P_BOOLEAN,
-// "&An example of a boolean preference",
-// getFieldEditorParent()));
-//
-// addField(new RadioGroupFieldEditor(
-// PreferenceConstants.P_CHOICE,
-// "An example of a multiple-choice preference",
-// 1,
-// new String[][] { { "&Choice 1", "choice1" }, {
-// "C&hoice 2", "choice2" }
-// }, getFieldEditorParent()));
-// addField(
-// new StringFieldEditor(PreferenceConstants.P_STRING, "A &text preference:", getFieldEditorParent()));
- addField(new BooleanFieldEditor(PreferenceConstants.SHADOWS,"Use Shadows",getFieldEditorParent()));
- addField(new RadioGroupFieldEditor(PreferenceConstants.POST_PROCESS, "Post Processing", 1,
- new String[][] { { "None", "none" },
- { "Sketch", "sketch" },
- { "Bloom", "bloom" }},
- getFieldEditorParent()));
- addField(new ScaleFieldEditor(PreferenceConstants.GIZMO_SCALE,"Gizmo scale",getFieldEditorParent(),5,100,1,10) {
- private double oldValue;
-
- @Override
- protected void doStore() {
- getPreferenceStore()
- .setValue(getPreferenceName(), scale.getSelection()*0.1);
- }
-
- @Override
- protected void doLoadDefault() {
- if (scale != null) {
- double value = getPreferenceStore().getDefaultDouble(getPreferenceName());
- scale.setSelection((int)(value*10.0));
- }
- valueChanged();
- }
-
- @Override
- protected void doLoad() {
- if (scale != null) {
- double value = getPreferenceStore().getDouble(getPreferenceName());
- scale.setSelection((int)(value*10.0));
- oldValue = value;
- };
- }
-
- @Override
- protected void valueChanged() {
- setPresentsDefaultValue(false);
-
- double newValue = scale.getSelection()*0.1;
- if (newValue != oldValue) {
- fireStateChanged(IS_VALID, false, true);
- fireValueChanged(VALUE, new Double(oldValue),
- new Double(newValue));
- oldValue = newValue;
- }
- }
- });
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
- */
- public void init(IWorkbench workbench) {
- }
-
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.preferences;
-
-/**
- * Constant definitions for plug-in preferences
- */
-public class PreferenceConstants {
-
- public static final String POST_PROCESS = "postProcess";
- public static final String SHADOWS = "shadows";
- public static final String GIZMO_SCALE = "gizmoScale";
-
-}
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.preferences;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.simantics.proconf.g3d.Activator;
-
-
-/**
- * Class used to initialize default preference values.
- */
-public class PreferenceInitializer extends AbstractPreferenceInitializer {
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
- */
- public void initializeDefaultPreferences() {
- IPreferenceStore store = Activator.getDefault()
- .getPreferenceStore();
-// store.setDefault(PreferenceConstants.P_BOOLEAN, true);
-// store.setDefault(PreferenceConstants.P_CHOICE, "choice2");
-// store.setDefault(PreferenceConstants.P_STRING,"Default value");
- store.setDefault(PreferenceConstants.POST_PROCESS, "none");
- store.setDefault(PreferenceConstants.SHADOWS, true);
- store.setDefault(PreferenceConstants.GIZMO_SCALE, 1.0);
- }
-
-}
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.scenegraph;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.AxisAngle4f;\r
-import javax.vecmath.Matrix3d;\r
-import javax.vecmath.Quat4d;\r
-import javax.vecmath.Vector3f;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.base.VecmathJmeTools;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-\r
-import com.jme.scene.Node;\r
-\r
-\r
-public abstract class AbstractGraphicsNode implements ISelectableNode {\r
-\r
- protected ThreeDimensionalEditorBase editor;\r
- \r
- protected IGraphicsNode parent = null;\r
-\r
- protected Resource shapeResource = null;\r
- \r
- protected boolean selected;\r
-\r
- protected Node parentGroup = null;\r
- protected Node transform = null;\r
- // protected Node center = null;\r
- \r
- protected String id;\r
- \r
- private ArrayList<IGraphicsNode> children = new ArrayList<IGraphicsNode>();\r
-\r
- public AbstractGraphicsNode(ThreeDimensionalEditorBase editor, IGraphicsNode parent, Graph graph, Resource shapeResource) {\r
- assert (parent != null);\r
- this.editor = editor;\r
- this.parent = parent;\r
- this.parentGroup = parent.getGroup();\r
- this.shapeResource = shapeResource;\r
- this.id = editor.getScenegraphAdapter().getNodeUID(shapeResource);\r
- createGroups();\r
- updateTransform(graph);\r
- parent.addChild(this);\r
- }\r
- \r
- @Override\r
- public String getID() {\r
- return id;\r
- }\r
- \r
- public void setID(String id) {\r
- this.id = id;\r
- }\r
-\r
- \r
- /* (non-Javadoc)\r
- * @see fi.vtt.proconf.shapeeditor.geometry.IGraphicsNode#getParent()\r
- */\r
- public IGraphicsNode getParent() {\r
- return parent;\r
- }\r
- \r
- public Collection<IGraphicsNode> getChildren() {\r
- return children;\r
- }\r
-\r
- private void createGroups() {\r
- transform = new Node(); // TODO : uid\r
- parentGroup.attachChild(transform);\r
- }\r
- \r
- public void addChild(IGraphicsNode node) {\r
- children.add(node);\r
- }\r
- \r
- public void removeChild(IGraphicsNode node) {\r
- children.remove(node);\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see fi.vtt.proconf.shapeeditor.geometry.IGraphicsNode#getGroup()\r
- */\r
- public Node getGroup() {\r
- //return center;\r
- \r
- return transform;\r
- }\r
-\r
- /**\r
- * Updates rotation and translation of the shape without recalculating\r
- * geometry\r
- */\r
- public void updateTransform(Graph graph) {\r
- G3DNode shape = getG3DNode(graph);\r
- if (shape.getLocalPosition() != null)\r
- transform.setLocalTranslation(VecmathJmeTools.get(G3DTools.getVectorFloat(shape.getLocalPosition())));\r
- if (shape.getLocalOrientation() != null) \r
- transform.setLocalRotation(VecmathJmeTools.get(G3DTools.getOrientationFloat(shape.getLocalOrientation())));\r
-// if (GraphicsNodeTools.hasCenter(shape)) {\r
-// center.setLocalTranslation(VecmathJmeTools.get(GraphicsNodeTools.getCenterFloat(shape)));\r
-// }\r
- // FIXME : typically transforms are updated once per frame (root as initiator) but with threaded access transformation may be read wrong.\r
- transform.updateWorldVectors();\r
- editor.getScenegraphAdapter().setChanged(true);\r
- }\r
-\r
-\r
- \r
- protected void update(Matrix3d aa) {\r
- transform.setLocalRotation(VecmathJmeTools.get(aa));\r
- }\r
- protected void update(AxisAngle4f aa) {\r
- transform.setLocalRotation(VecmathJmeTools.get(aa));\r
- }\r
- \r
- protected void update(AxisAngle4d aa) {\r
- transform.setLocalRotation(VecmathJmeTools.get(aa));\r
- }\r
- \r
- protected void update(Quat4d q) {\r
- transform.setLocalRotation(VecmathJmeTools.get(q));\r
- }\r
- \r
- protected void update(Vector3f v) {\r
- transform.setLocalTranslation(VecmathJmeTools.get(v));\r
- }\r
-\r
-\r
- public void setSelected(boolean selected) {\r
- if (this.selected == selected)\r
- return;\r
- this.selected = selected;\r
- }\r
-\r
- public boolean isSelected() {\r
- return selected;\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see fi.vtt.proconf.shapeeditor.geometry.IGraphicsNode#getResource()\r
- */\r
- public Resource getResource() {\r
- return shapeResource;\r
- }\r
-\r
- public G3DNode getG3DNode(Graph graph) {\r
- return new G3DNode(graph,shapeResource);\r
- }\r
-\r
- /* (non-Javadoc)\r
- * @see fi.vtt.proconf.shapeeditor.geometry.IGraphicsNode#dispose()\r
- */\r
- public void dispose() {\r
-// if (children.size() != 0) {\r
-// System.out.print(getResource() + " contains children: ");\r
-// ArrayList<IGraphicsNode> c = new ArrayList<IGraphicsNode>(children);\r
-// for (IGraphicsNode n : c) {\r
-// System.out.print(n.getResource() + " ");\r
-// }\r
-// System.out.println();\r
-// return;\r
-// }\r
- assert (children.size() == 0);\r
-\r
- transform.removeFromParent();\r
- transform.dispose();\r
- if (parent != null)\r
- parent.removeChild(this);\r
- }\r
- \r
- \r
- public abstract void setPickable(boolean pickable);\r
- \r
- public String toString() {\r
- return this.getClass().toString();\r
- }\r
- \r
- @Override\r
- public int hashCode() {\r
- return shapeResource.hashCode();\r
- }\r
-\r
-\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.scenegraph;\r
-\r
-import org.simantics.db.Graph;\r
-\r
-public interface IGeometryNode extends IGraphicsNode{\r
- \r
- public void updateGeometry(Graph graph);\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.scenegraph;\r
-\r
-import java.util.Collection;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-\r
-import com.jme.scene.Node;\r
-\r
-public interface IGraphicsNode {\r
-\r
- public IGraphicsNode getParent();\r
-\r
- public Node getGroup();\r
-\r
- public Resource getResource();\r
-\r
- /**\r
- * Disposes the node. Disposing of node that has children is not allowed.\r
- */\r
- public void dispose();\r
-\r
- public void updateTransform(Graph graph);\r
- \r
- public G3DNode getG3DNode(Graph graph);\r
- \r
- public void addChild(IGraphicsNode node);\r
- public void removeChild(IGraphicsNode node);\r
- public Collection<IGraphicsNode> getChildren();\r
-\r
- \r
-\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.scenegraph;\r
-\r
-public interface ISelectableNode extends IGraphicsNode{\r
- public void setVisible(boolean visible);\r
- public boolean isVisible();\r
- public void setSelected(boolean selected);\r
- public boolean isSelected();\r
- public void setHighlighted(boolean higlighted);\r
- public boolean isHighlighted();\r
- public void setPickable(boolean pickable);\r
- public String getID();\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.scenegraph;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.proconf.g3d.Resources;\r
-import org.simantics.proconf.g3d.animation.Animatable;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.stubs.G3DModel;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-public class ModelNode extends AbstractGraphicsNode implements Animatable, IGeometryNode{\r
- protected List<ShapeNode> shapes = new ArrayList<ShapeNode>();\r
- private boolean highlighted;\r
- \r
- protected Resource modelResource;\r
- \r
- private boolean geometryCreated = false;\r
- \r
- public ModelNode(ThreeDimensionalEditorBase editor,IGraphicsNode parent, Graph graph, Resource shapeResource) {\r
- super(editor,parent, graph, shapeResource);\r
- \r
- }\r
- \r
- protected void createGeometry(Graph graph) {\r
- \r
- if (modelResource != null) {\r
- G3DModel model = getG3DModel(graph);\r
- Collection<G3DNode> nodes = model.getChild();\r
- if (nodes.size() == 0) {\r
- ErrorLogger.defaultLogError("ModelNode " + model.getResource().getResourceId() + " has no shapes", null);\r
- return;\r
- }\r
- for (G3DNode node: nodes) {\r
- ShapeNode shape = new ShapeNode(editor,this,graph,node.getResource());\r
- shapes.add(shape);\r
-\r
- shape.setID(getID());\r
- shape.setVisible(true);\r
- shape.updateGeometry(graph);\r
- createRecursive(graph,shape);\r
- } \r
- geometryCreated = true;\r
- }\r
- }\r
- \r
- private void createRecursive(Graph graph,IGraphicsNode parentNode) {\r
- Collection<G3DNode> nodes = parentNode.getG3DNode(graph).getChild();\r
- for (G3DNode node: nodes) {\r
- if (node.getRelatedObjects(Resources.g3dResource.GeometryDefinitionOf).size() == 0) {\r
- ShapeNode shape = new ShapeNode(editor,parentNode,graph,node.getResource());\r
- shapes.add(shape);\r
-\r
- shape.setID(getID());\r
- shape.setVisible(true);\r
- shape.updateGeometry(graph);\r
- createRecursive(graph,shape);\r
- }\r
- } \r
- }\r
- \r
- public void updateGeometry(Graph graph) {\r
- if (!geometryCreated) {\r
- createGeometry(graph);\r
- return;\r
- }\r
- updateTransform(graph);\r
-// for (IGraphicsNode node : getChildren()) {\r
-// ((IGeometryNode)node).updateGeometry();\r
-// }\r
- for (ShapeNode node : shapes)\r
- node.updateGeometry(graph);\r
- }\r
- \r
- public boolean isVisible() {\r
- for (IGraphicsNode n : getChildren())\r
- if (n instanceof ISelectableNode)\r
- if (!((ISelectableNode)n).isVisible())\r
- return false;\r
- return true;\r
- }\r
- \r
- public void setVisible(boolean visible) {\r
- for (IGraphicsNode node : getChildren()) {\r
- if (node instanceof ISelectableNode)\r
- ((ISelectableNode)node).setVisible(visible);\r
- }\r
- }\r
- \r
- @Override\r
- public void dispose() {\r
- // shapes must be removed reverse order (leafs first)\r
- for (int i = shapes.size() - 1; i >= 0; i--) {\r
- shapes.get(i).dispose();\r
- }\r
- super.dispose();\r
- }\r
- \r
- \r
- @Override\r
- public void setPickable(boolean pickable) {\r
- for(ShapeNode n : shapes) {\r
- n.setPickable(pickable);\r
- }\r
- }\r
- \r
- public boolean isHighlighted() {\r
- return highlighted;\r
- }\r
- \r
- public void setHighlighted(boolean selected) {\r
- if (this.highlighted == selected)\r
- return;\r
- this.highlighted = selected;\r
- for (ShapeNode n : shapes)\r
- n.setHighlighted(selected);\r
- \r
- }\r
- \r
- @Override\r
- public void setSelected(boolean selected) {\r
- if (this.selected == selected)\r
- return;\r
- this.selected = selected;\r
- for (ShapeNode n : shapes)\r
- n.setSelected(selected);\r
- }\r
- \r
- public void animate(double delta, double frameTime) {\r
- for (ShapeNode n : shapes)\r
- n.animate(delta,frameTime);\r
- }\r
- \r
- public G3DModel getG3DModel(Graph graph) {\r
- return new G3DModel(graph, modelResource);\r
- }\r
- \r
- public boolean setAnimation(Graph graph, Resource animation) {\r
- if (modelResource == null) {\r
- ErrorLogger.getDefault().logWarning("Cannot set animation for " + shapeResource + " since it has no graphics", null);\r
- return false; \r
- }\r
- Collection<Resource> animations = graph.getObjects(modelResource, Resources.animationResource.HasAnimation);\r
- if (!animations.contains(animation)) {\r
- ErrorLogger.getDefault().logWarning("Cannot set animation for " + shapeResource + " since it doesn't have requested animation " + animation.getResource(), null);\r
- return false;\r
- }\r
- \r
- boolean set = false;\r
- for (ShapeNode n : shapes) {\r
- if (n.setAnimation(graph,animation))\r
- set = true;\r
- }\r
- return set;\r
- }\r
- \r
- public boolean setRandomAnimation(Graph graph) {\r
- if (modelResource == null) {\r
- ErrorLogger.getDefault().logWarning("Cannot set animation for " + shapeResource + " since it has no graphics", null);\r
- return false; \r
- }\r
- G3DModel model = getG3DModel(graph);\r
- Collection<org.simantics.animation.stubs.Animation> animations = model.getAnimation();\r
- int num = animations.size();\r
- if (num == 0) {\r
- ErrorLogger.getDefault().logWarning("Cannot set animation for " + shapeResource + " since it has no animations", null);\r
- return false; \r
- }\r
- int random = (int)Math.round(Math.random() * (num-1));\r
- Iterator<org.simantics.animation.stubs.Animation> i = animations.iterator();\r
- while(random > 0) {\r
- i.next();\r
- random--;\r
- }\r
- return setAnimation(graph,i.next().getResource());\r
- \r
- }\r
- \r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.scenegraph;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-\r
-import com.jme.scene.Node;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-\r
-public abstract class NonTransformableNode implements IGraphicsNode {\r
-\r
- private IGraphicsNode parent;\r
- private ArrayList<IGraphicsNode> children = new ArrayList<IGraphicsNode>();\r
- protected Node parentGroup = null;\r
- protected Resource nodeResource;\r
-\r
- public NonTransformableNode(IGraphicsNode parent, Resource nodeResource) {\r
- this.parent = parent;\r
- this.nodeResource = nodeResource;\r
- parentGroup = parent.getGroup();\r
- parent.addChild(this);\r
- }\r
-\r
- public void addChild(IGraphicsNode node) {\r
- children.add(node);\r
- \r
- }\r
- \r
- public Collection<IGraphicsNode> getChildren() {\r
- return children;\r
- }\r
- \r
- public void removeChild(IGraphicsNode node) {\r
- children.remove(node);\r
- \r
- }\r
-\r
- public void dispose() {\r
- assert(children.size() == 0);\r
- if (parent != null)\r
- parent.removeChild(this); \r
- }\r
-\r
- public G3DNode getG3DNode(Graph graph) {\r
- return new G3DNode(graph, nodeResource);\r
- }\r
- \r
- public Node getGroup() {\r
- return parentGroup;\r
- }\r
-\r
-\r
- public IGraphicsNode getParent() {\r
- return parent;\r
- }\r
-\r
-\r
- public Resource getResource() {\r
- return nodeResource;\r
- }\r
-\r
- public void updateTransform(Graph graph) {\r
- \r
- }\r
-\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.scenegraph;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-import org.simantics.db.Builtins;\r
-import org.simantics.db.ContextGraph;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.equation.solver.Solver;\r
-import org.simantics.animation.stubs.Animation;\r
-import org.simantics.layer0.utils.Property;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.Statement;\r
-import org.simantics.proconf.g3d.Resources;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.stubs.G3DModel;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-/**\r
- * IGraphicsNode for parameterized models. Implementation assumes that G3DNode itself does not contain\r
- * graphical representation but has link to it. \r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public class ParameterizedModelNode extends ModelNode {\r
- \r
- /**\r
- * @param editor\r
- * @param parent\r
- * @param graph\r
- * @param resource this node (G3DNode).\r
- * @param nodeToModelRelation relation from this node to the model, or from type of this node to the model.\r
- * @param modelToParametersRelation relation from the model to its sizing parameters\r
- */\r
- public ParameterizedModelNode(ThreeDimensionalEditorBase editor, IGraphicsNode parent, Graph graph, Resource resource, Resource nodeToModelRelation) {\r
- super(editor,parent,graph,resource);\r
- G3DNode shape = getG3DNode(graph);\r
- List<IEntity> models = new ArrayList<IEntity>();\r
- models.addAll(shape.getRelatedObjects(nodeToModelRelation));\r
- if (models.size() == 0) {\r
- Collection<IEntity> types = shape.getTypes();\r
- for (IEntity type : types) {\r
- models.addAll(type.getRelatedObjects(nodeToModelRelation));\r
- }\r
- }\r
- if (models.size() != 1)\r
- throw new IllegalArgumentException("Cannot find proper model: found " + models.size() + " models.");\r
- \r
- this.modelResource = models.iterator().next().getResource();\r
- }\r
- \r
- @Override\r
- protected void createGeometry(Graph graph) {\r
- super.createGeometry(createParameterization(graph));\r
- }\r
- \r
- @Override\r
- public void updateGeometry(Graph graph) { \r
- super.updateGeometry(createParameterization(graph));\r
- }\r
- \r
- private void updateSizeParameters(ContextGraph graph, Solver solver) {\r
- Builtins builtins = graph.getBuiltins();\r
-\r
- \r
- G3DNode node = getG3DNode(graph);\r
- //Collection<Property> nodeProperties = node.getRelatedProperties(builtins.HasProperty);\r
- Collection<Statement> nodeProperties = node.getRelatedStatements(builtins.HasProperty);\r
- G3DModel model = getG3DModel(graph);\r
- Collection<Property> modelProperties = model.getRelatedProperties(Resources.g3dResource.HasSizingParameter);\r
- \r
- // there are no relations between then nodes properties and the model's sizing parameters\r
- // link between them is done by matching names\r
- for (Property m : modelProperties) {\r
- boolean set = false;\r
- //if(m.canBeSet(builtins.HasName)) {\r
-\r
- String modelPropertyname = m.getAtMostOneRelatedProperty(builtins.HasName).getScalarString();\r
- for (Statement n : nodeProperties) {\r
- String relationName = n.getPredicate().getName();\r
- if (relationName.startsWith("Has "))\r
- relationName = relationName.substring(4);\r
- if (relationName.equalsIgnoreCase(modelPropertyname)) {\r
- // found a match\r
- // set property's value for Solver\r
- solver.setValue(m.getResource(), graph.getValueAsObject(n.getObject().getResource()));\r
- set = true;\r
- break;\r
- }\r
- \r
- }\r
- if (!set) {\r
- ErrorLogger.defaultLogError("Cannot map property " + modelPropertyname, null);\r
- }\r
- //}\r
- \r
- }\r
- \r
- for (Property p : modelProperties) {\r
- IEntity t = EntityFactory.create(graph, p.getResource());\r
- Collection<IEntity> exp = t.getRelatedObjects(Resources.equationResource.HasTarget);\r
- if (exp.size() > 0) { \r
- Iterator<IEntity> i = exp.iterator();\r
- while(i.hasNext())\r
- solver.evaluate(i.next());\r
- } else\r
- ErrorLogger.defaultLogError("Model property " + p + " is not bound to a expression",null);\r
- }\r
- solver.pushToGraph(graph);\r
- Collection<Animation> animations = model.getAnimation();\r
- for (Animation animation : animations) {\r
- Collection<org.simantics.animation.stubs.Interpolator> interpolators = animation.getInterpolator();\r
- for (org.simantics.animation.stubs.Interpolator interpolator : interpolators) {\r
- IEntity target = interpolator.getTarget();\r
- // check all model properties\r
- for (Property p : modelProperties) {\r
- IEntity t = EntityFactory.create(graph,p.getResource());\r
- // get parameterization equations\r
- Collection<IEntity> equations = t.getRelatedObjects(Resources.equationResource.HasTarget);\r
- // get parameterized values\r
- Collection<IEntity> parameterTargets = new ArrayList<IEntity>();\r
- for (IEntity eq : equations) {\r
- Collection<IEntity> tgts = eq.getRelatedObjects(Resources.equationResource.HasTarget);\r
- assert(tgts.size() == 1);\r
- parameterTargets.add(tgts.iterator().next());\r
- }\r
- // do matching between interpolator targets and parameterized values\r
- // TODO : old system did not have inverse relations but current system does.\r
- // it is possible to take interpolation target and find if it is connected to an equation\r
- // this would make code much faster (no more stupid loops over everything)\r
- for (IEntity d : parameterTargets) {\r
- if (d.getResource().equals(target.getResource())) {\r
- // get default value for sizing property\r
- Collection<IEntity> prop = t.getRelatedObjects(Resources.g3dResource.HasDefaultDoubleValue);\r
- if (prop.size() == 1) {\r
- Resources.curveBuilder.parameterize(interpolator, prop.iterator().next().toProperty().getDoubleArray(), p.getDoubleArray());\r
- } else {\r
- ErrorLogger.defaultLogError("Cannot parameterize interpolator " + interpolator.getResource() + " of animation " + animation.getResource() + " since parameter " + p.getResource() + " has no default value", null);\r
- }\r
- }\r
- }\r
- }\r
- }\r
- }\r
- \r
- }\r
- \r
- protected Graph createParameterization(Graph graph) {\r
- // create ContextGraph if needed\r
- ContextGraph g;\r
- if (!(graph instanceof ContextGraph))\r
- g = new ContextGraph(graph);\r
- else\r
- g = (ContextGraph)graph;\r
- // set the context\r
- g.setContext(this.shapeResource);\r
- // create solver and calculate parameterized values\r
- Solver solver = new Solver();\r
- updateSizeParameters(g, solver);\r
- // push parameterized values to context\r
- solver.pushToGraph(g);\r
- // return graph with parameterized values\r
- return g;\r
- }\r
- \r
- @Override\r
- public boolean setAnimation(Graph graph, Resource animation) { \r
- return super.setAnimation(createParameterization(graph), animation);\r
- }\r
- \r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.scenegraph;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.proconf.g3d.base.JmeRenderingComponent;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-\r
-import com.jme.scene.Node;\r
-\r
-public class RootGraphicsNode implements IGraphicsNode {\r
-\r
- JmeRenderingComponent component;\r
- Resource rootNode;\r
- private ArrayList<IGraphicsNode> children = new ArrayList<IGraphicsNode>();\r
-\r
- \r
- public RootGraphicsNode(JmeRenderingComponent component, Resource rootNode) {\r
- this.component = component;\r
- this.rootNode = rootNode;\r
- }\r
- \r
- public void addChild(IGraphicsNode node) {\r
- children.add(node);\r
- }\r
- \r
- public void removeChild(IGraphicsNode node) {\r
- children.remove(node);\r
- }\r
- \r
- public Collection<IGraphicsNode> getChildren() {\r
- return children;\r
- }\r
-\r
- public void dispose() {\r
- //throw new RuntimeException("Root cannot be disposed");\r
- }\r
-\r
- public Node getGroup() {\r
- return component.getShadowRoot();\r
- }\r
-\r
- public IGraphicsNode getParent() {\r
- return null;\r
- }\r
-\r
- public Resource getResource() {\r
- return rootNode;\r
- }\r
-\r
- public void updateTransform(Graph graph) {\r
-\r
- }\r
- \r
- public String toString() {\r
- return this.getClass().toString();\r
- }\r
-\r
- public G3DNode getG3DNode(Graph graph) {\r
- return new G3DNode(graph, rootNode);\r
- }\r
- \r
-\r
-\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.scenegraph;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.List;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.Quat4d;\r
-\r
-import org.simantics.animation.stubs.Interpolator;\r
-import org.simantics.animation.curve.SlerpCurve;\r
-import org.simantics.animation.curve.TCBCurve;\r
-import org.simantics.proconf.g3d.Resources;\r
-import org.simantics.proconf.g3d.animation.Animatable;\r
-import org.simantics.proconf.g3d.animation.Animation;\r
-import org.simantics.proconf.g3d.animation.ChanneledColorInterpolator;\r
-import org.simantics.proconf.g3d.animation.ChanneledPositionInterpolator;\r
-import org.simantics.proconf.g3d.animation.ConstantInterpolator;\r
-import org.simantics.proconf.g3d.animation.ScalarInterpolator;\r
-import org.simantics.proconf.g3d.animation.SlerpInterpolator;\r
-import org.simantics.proconf.g3d.animation.TCBInterpolator;\r
-import org.simantics.proconf.g3d.base.AppearanceProvider;\r
-import org.simantics.proconf.g3d.base.AppearanceProviderRegistry;\r
-import org.simantics.proconf.g3d.base.AppearanceTools;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.GeometryProvider;\r
-import org.simantics.proconf.g3d.base.GeometryProviderRegistry;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.stubs.Appearance;\r
-import org.simantics.proconf.g3d.stubs.Color;\r
-import org.simantics.proconf.g3d.stubs.G3DModel;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-import org.simantics.proconf.g3d.stubs.Orientation;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-import com.jme.bounding.BoundingBox;\r
-import com.jme.bounding.CollisionTreeManager;\r
-import com.jme.intersection.PickResults;\r
-import com.jme.math.Ray;\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.renderer.Renderer;\r
-import com.jme.scene.Geometry;\r
-import com.jme.scene.Node;\r
-import com.jme.scene.SharedMesh;\r
-import com.jme.scene.TriMesh;\r
-import com.jme.scene.state.AlphaState;\r
-import com.jme.scene.state.MaterialState;\r
-import com.jme.scene.state.RenderState;\r
-import com.jme.scene.state.WireframeState;\r
-import com.jme.scene.state.ZBufferState;\r
-\r
-import org.simantics.db.Builtins;\r
-import org.simantics.db.ContextGraph;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.IEntity;\r
-\r
-public class ShapeNode extends AbstractGraphicsNode implements Animatable, IGeometryNode{\r
-\r
- public static final int NORMAL = 0;\r
- public static final int TRANSPARENT = 1;\r
- public static final int SELECTED_EDGE = 2;\r
- public static final int HIGHLIGHTED_EDGE = 3;\r
- \r
- private boolean highlighted = false;\r
-\r
- protected Geometry mesh = null;\r
- protected Geometry lines = null;\r
- protected Geometry[] geometry = null;\r
-\r
- private boolean visible[] = new boolean[4];\r
- \r
- private Node body;\r
- private Node transparent;\r
- private Node edge;\r
-\r
- private MaterialState selectedEdgeState;\r
- private MaterialState highlightedEdgeState;\r
- \r
- private Collection<RenderState> renderStates;\r
- private boolean isTransparent;\r
- \r
-\r
- public ShapeNode(ThreeDimensionalEditorBase editor,IGraphicsNode parent, Graph graph, Resource shapeResource) {\r
- super(editor,parent, graph, shapeResource);\r
- for (int i = 0; i < visible.length; i++)\r
- visible[i] = false;\r
- \r
- body = new Node();\r
-\r
- body.setName(id); \r
- \r
- \r
- transparent = new Node() {\r
- private static final long serialVersionUID = 1L;\r
- @Override\r
- public void calculatePick(Ray ray, PickResults results) {\r
- \r
- }\r
- };\r
- \r
- // transparent.setRenderQueueMode(Renderer.QUEUE_TRANSPARENT);\r
- \r
- edge = new Node(){\r
- private static final long serialVersionUID = 1L;\r
- @Override\r
- public void calculatePick(Ray ray, PickResults results) {\r
- \r
- }\r
- };\r
- transparent.setIsCollidable(false);\r
- edge.setIsCollidable(false);\r
- \r
- MaterialState ms = editor.getRenderingComponent().getDisplaySystem().getRenderer().createMaterialState();\r
- ms.setDiffuse(new ColorRGBA(0.0f, 0.75f, 0.0f,0.3f));\r
- ms.setEmissive(new ColorRGBA(0f, 0f, 0f,0.3f));\r
- ms.setSpecular(new ColorRGBA(0.5f, 0.5f, 0.5f,0.3f));\r
- ms.setAmbient(new ColorRGBA(0.0f, 0.75f, 0.0f,0.3f));\r
- ms.setShininess(128.f);\r
- ms.setMaterialFace(MaterialState.MF_FRONT_AND_BACK);\r
- transparent.setRenderState(ms);\r
- \r
- AlphaState as = editor.getRenderingComponent().getDisplaySystem().getRenderer().createAlphaState();\r
- as.setBlendEnabled(true);\r
- as.setDstFunction(AlphaState.DB_ONE_MINUS_SRC_ALPHA);\r
- as.setSrcFunction(AlphaState.DB_SRC_ALPHA);\r
- transparent.setRenderState(as);\r
- \r
- ms = editor.getRenderingComponent().getDisplaySystem().getRenderer().createMaterialState();\r
- ms.setDiffuse(new ColorRGBA(1.f, 1.f, 1.f, 1.f));\r
- ms.setEmissive(new ColorRGBA(1.f, 1.f, 1.f, 1.f));\r
- ms.setSpecular(new ColorRGBA(1.f, 1.f, 1.f, 1.f));\r
- ms.setAmbient(new ColorRGBA(1.f, 1.f, 1.f, 1.f));\r
- ms.setShininess(128.f);\r
- selectedEdgeState = ms;\r
- \r
- ms = editor.getRenderingComponent().getDisplaySystem().getRenderer().createMaterialState();\r
- ms.setDiffuse(new ColorRGBA(1.f, 0.f, 1.f, 1.f));\r
- ms.setEmissive(new ColorRGBA(1.f, 0.f, 1.f, 1.f));\r
- ms.setSpecular(new ColorRGBA(1.f, 0.f, 1.f, 1.f));\r
- ms.setAmbient(new ColorRGBA(1.f, 0.f, 1.f, 1.f));\r
- ms.setShininess(128.f);\r
- \r
- highlightedEdgeState = ms;\r
-\r
- \r
- }\r
-\r
-\r
- /**\r
- * This method is used to get implementation specific geometry.\r
- * Arrays first element is a mesh, second contains edges.\r
- * @return\r
- */\r
- public Geometry[] getGeometry(Graph graph, boolean update) {\r
- G3DNode shape = getG3DNode(graph);\r
- final GeometryProvider provider = GeometryProviderRegistry.getGeometryProvider(shape);\r
- if (!update) {\r
- return provider.getGeometryFromResource(shape, false);\r
- } else {\r
- if (geometry == null) {\r
- geometry = provider.getGeometryFromResource(shape, false);\r
- } else {\r
- provider.reconstructGeometry(shape, false, geometry);\r
- }\r
- return geometry;\r
- }\r
- }\r
-\r
- /**\r
- * Updates shapes and it's ancestors geometry\r
- */\r
- public void updateGeometry(Graph graph) {\r
- updateTransform(graph);\r
- // cleanAnimation();\r
- //System.out.println("ShapeNode.updateGeometry() " + name);\r
- if (geometry == null) {\r
- Geometry g[] = getGeometry(graph,true);\r
- if (g != null) {\r
- mesh = g[0];\r
- //TODO : uid\r
- mesh.setName(id); \r
- mesh.setModelBound(new BoundingBox());\r
- if (g.length > 1) {\r
- lines = g[1];\r
- } else {\r
- lines = null;\r
- }\r
- body.attachChild(mesh);\r
- transparent.detachAllChildren();\r
- SharedMesh m = new SharedMesh("",(TriMesh)mesh);\r
- m.setRenderQueueMode(Renderer.QUEUE_TRANSPARENT);\r
- m.getBatch(0).setCastsShadows(false);\r
- transparent.attachChild(m);\r
- \r
- \r
- if (lines == null) {\r
- WireframeState ws = editor.getRenderingComponent().getDisplaySystem().getRenderer().createWireframeState();\r
- edge.attachChild(new SharedMesh("",(TriMesh)mesh));\r
- edge.setRenderState(ws);\r
- } else {\r
- ZBufferState zs = editor.getRenderingComponent().getDisplaySystem().getRenderer().createZBufferState();\r
- zs.setFunction(ZBufferState.CF_ALWAYS);\r
- AlphaState as = editor.getRenderingComponent().getDisplaySystem().getRenderer().createAlphaState();\r
- as.setBlendEnabled(true);\r
- as.setDstFunction(AlphaState.DB_ONE_MINUS_SRC_ALPHA);\r
- as.setSrcFunction(AlphaState.DB_SRC_ALPHA);\r
- lines.setRenderState(zs);\r
- lines.setRenderState(as);\r
- lines.setRenderQueueMode(Renderer.QUEUE_TRANSPARENT);\r
- edge.attachChild(lines);\r
- }\r
-\r
- }\r
- }\r
- if (geometry != null) {\r
- getGeometry(graph,true);\r
-\r
- \r
- G3DNode shape = getG3DNode(graph);\r
- //if (renderStates == null)\r
- updateAppearance(shape);\r
-\r
- if (isVisible()) {\r
- getGroup().attachChild(body);\r
- } else {\r
- body.removeFromParent();\r
- }\r
- if (isTransparentVisible()) {\r
- getGroup().attachChild(transparent);\r
- //setVisible(TRANSPARENT, true);\r
- } else {\r
- transparent.removeFromParent();\r
- }\r
-\r
- if (isSelectedVisible() || isHighlightedVisible()) {\r
- getGroup().attachChild(edge);\r
- //setVisible(SELECTED_EDGE, true);\r
- } else {\r
- edge.removeFromParent();\r
- //setVisible(SELECTED_EDGE,false);\r
- }\r
- \r
- \r
- mesh.updateModelBound();\r
- CollisionTreeManager.getInstance().updateCollisionTree(mesh);\r
- //mesh.updateCollisionTree();\r
- \r
- }\r
- }\r
- \r
- protected void updateAppearance(IEntity shape) {\r
- AppearanceProvider provider = AppearanceProviderRegistry.getAppearanceProvider(shape);\r
- if (provider != null) {\r
- renderStates = provider.getAppearanceFromResource(shape, editor.getRenderingComponent().getDisplaySystem().getRenderer());\r
- } else {\r
- renderStates = getMaterial();\r
- }\r
- \r
- isTransparent = false;\r
- for (RenderState s : renderStates) {\r
- if (s instanceof AlphaState)\r
- isTransparent = true;\r
- }\r
- setAppearance();\r
- }\r
- \r
- protected void setAppearance() {\r
- if (mesh == null || renderStates == null) {\r
- return;\r
- }\r
- for (RenderState s : renderStates)\r
- mesh.setRenderState(s);\r
- if (isTransparent)\r
- mesh.setRenderQueueMode(Renderer.QUEUE_TRANSPARENT);\r
- else\r
- mesh.setRenderQueueMode(Renderer.QUEUE_OPAQUE);\r
- }\r
-\r
- public void setSelected(boolean selected) {\r
- if (this.selected == selected)\r
- return;\r
- this.selected = selected;\r
- if (selected) {\r
-\r
- setSelectedVisible(true);\r
- setTransparentVisible(true);\r
- } else {\r
- setSelectedVisible(false);\r
- setTransparentVisible(false);\r
- }\r
- }\r
-\r
- public boolean isSelected() {\r
- return selected;\r
- }\r
- \r
- \r
-\r
- public boolean isHighlighted() {\r
- return highlighted;\r
- }\r
-\r
- public void setHighlighted(boolean highlighted) {\r
- if (this.highlighted == highlighted)\r
- return;\r
- this.highlighted = highlighted;\r
- if (highlighted) {\r
- setHighlightedVisible(true);\r
- } else {\r
- setHighlightedVisible(false);\r
- }\r
- }\r
- \r
- public boolean isVisible(int shape) {\r
- return visible[shape];\r
- }\r
- \r
- public void setVisible(int shape, boolean visible) {\r
- if (this.visible[shape] == visible)\r
- return; \r
- this.visible[shape] = visible;\r
- if (mesh == null) {\r
- return;\r
- }\r
- if (this.visible[NORMAL]){\r
- getGroup().attachChild(body);\r
- } else {\r
- body.removeFromParent();\r
- }\r
- if (this.visible[TRANSPARENT]) {\r
- getGroup().attachChild(transparent);\r
- } else {\r
- transparent.removeFromParent();\r
- }\r
- if (this.visible[SELECTED_EDGE] || this.visible[HIGHLIGHTED_EDGE]) {\r
- if (this.visible[HIGHLIGHTED_EDGE])\r
- edge.setRenderState(highlightedEdgeState);\r
- else\r
- edge.setRenderState(selectedEdgeState);\r
- getGroup().attachChild(edge);\r
- edge.updateRenderState();\r
- } else {\r
- edge.removeFromParent();\r
- } \r
- }\r
-\r
- public boolean isVisible() {\r
- return isVisible(NORMAL);\r
- }\r
-\r
- public void setVisible(boolean visible) {\r
- setVisible(NORMAL, visible);\r
- }\r
-\r
- public boolean isSelectedVisible() {\r
- return isVisible(SELECTED_EDGE);\r
- }\r
-\r
- public void setSelectedVisible(boolean visible) {\r
- setVisible(SELECTED_EDGE, visible);\r
- }\r
-\r
- public boolean isHighlightedVisible() {\r
- return isVisible(HIGHLIGHTED_EDGE);\r
- }\r
-\r
- public void setHighlightedVisible(boolean visible) {\r
- setVisible(HIGHLIGHTED_EDGE, visible);\r
- \r
- }\r
-\r
- \r
-\r
- public boolean isTransparentVisible() {\r
- return isVisible(TRANSPARENT);\r
- }\r
-\r
- public void setTransparentVisible(boolean visible) {\r
- setVisible(TRANSPARENT, visible);\r
- }\r
-\r
- public void setPickable(boolean pickable) {\r
- body.setIsCollidable(pickable);\r
- }\r
- \r
- public Collection<RenderState> getMaterial() {\r
- List<RenderState> states = new ArrayList<RenderState>();\r
- MaterialState ms = editor.getRenderingComponent().getDisplaySystem().getRenderer().createMaterialState();\r
- ms.setEmissive(new ColorRGBA(0.f,0.f,0.f,0.f));\r
- ms.setSpecular(new ColorRGBA(1.f,1.f,1.f,1.f));\r
- ms.setDiffuse(new ColorRGBA(0.75f,0.f,0.f,0.f));\r
- ms.setAmbient(new ColorRGBA(0.75f,0.f,0.f,0.f));\r
- ms.setEnabled(true);\r
- ms.setShininess(128.f);\r
- states.add(ms);\r
-\r
- return states; \r
- }\r
- \r
- private Animation animation;\r
- private static int preCalcSteps = 9;\r
- private Geometry[] preCalc = null;\r
- private int currentPreCalc = 0;\r
- \r
- public void animate(double delta,double frameTime) {\r
- if (animation != null)\r
- animation.interpolate(delta);\r
- if (preCalc != null) {\r
- int newPreCalc = (int)Math.round(delta*(preCalc.length-1));\r
- if (currentPreCalc != newPreCalc) {\r
-\r
- preCalc[currentPreCalc].removeFromParent();\r
- currentPreCalc = newPreCalc;\r
- \r
- body.attachChild(preCalc[currentPreCalc]);\r
- }\r
- }\r
- }\r
- \r
- private void cleanAnimation() {\r
- this.animation = null;\r
- if (preCalc != null) {\r
- for (Geometry g : preCalc) {\r
- if (g != null) {\r
- g.removeFromParent();\r
- g.clearBuffers();\r
- }\r
- }\r
- preCalc = null;\r
- }\r
- }\r
-\r
- /**\r
- * Sets shape's animation\r
- * TODO : multiple animations at the same time! (must check common animatable properties)\r
- * TODO : initial values (material, ..) (requires changes in the ontology)\r
- * TODO : messy code, refactor!\r
- * TODO : calculate number of required pre-calculated geometries \r
- * @param animation\r
- */\r
- public boolean setAnimation(Graph g, Resource res) {\r
- ContextGraph graph;\r
- if (g instanceof ContextGraph) {\r
- graph = (ContextGraph)g;\r
- } else {\r
- graph = new ContextGraph(g);\r
- graph.setContext(shapeResource);\r
- }\r
- cleanAnimation();\r
- if (res == null) {\r
- if (isVisible())\r
- body.attachChild(mesh);\r
- return false;\r
- }\r
- org.simantics.animation.stubs.Animation animation = new org.simantics.animation.stubs.Animation(graph,res);\r
- G3DNode shape = getG3DNode(graph);\r
- G3DNode modelResource = G3DTools.getModelFromResource(graph,shape.getResource());\r
- assert (modelResource != null);\r
- G3DModel model = new G3DModel(graph,modelResource.getResource());\r
- Collection<org.simantics.animation.stubs.Animation> animations = model.getAnimation();\r
- boolean found = false;\r
- for (org.simantics.animation.stubs.Animation a : animations) {\r
- if (a.getResource().equals(animation.getResource())) {\r
- found = true;\r
- break;\r
- }\r
- }\r
- if (!found) {\r
- ErrorLogger.getDefault().logWarning("Shape " + shape.getResource() + " cannot handle animation " + animation.getResource() + " because it isn't model's animation", null);\r
- return false;\r
- }\r
- Collection<org.simantics.animation.stubs.Interpolator> interpolators = animation.getInterpolator();\r
- List<org.simantics.animation.stubs.Interpolator> handled = new ArrayList<org.simantics.animation.stubs.Interpolator>();\r
- List<org.simantics.animation.stubs.Interpolator> precalculated = new ArrayList<org.simantics.animation.stubs.Interpolator>();\r
- for (org.simantics.animation.stubs.Interpolator i : interpolators) {\r
- IEntity target = i.getTarget();\r
- if (G3DTools.hasProperty(graph,shape.getResource(),target.getResource()))\r
- handled.add(i);\r
- else if (G3DTools.hasSubProperty(graph,shape.getResource(),target.getResource())) {\r
- precalculated.add(i);\r
- }\r
- }\r
- if (handled.size() == 0 && precalculated.size() == 0) {\r
- ErrorLogger.getDefault().logWarning("Shape " + shape.getResource() + " cannot handle animation " + animation.getResource() + " since it doesn't change any of shape's properties", null);\r
- return false;\r
- }\r
- \r
- \r
- this.animation = new Animation();\r
- \r
- org.simantics.animation.stubs.Interpolator[] pos = new org.simantics.animation.stubs.Interpolator[3];\r
- org.simantics.animation.stubs.Interpolator[] ambient = new org.simantics.animation.stubs.Interpolator[3];\r
- org.simantics.animation.stubs.Interpolator[] diffuse = new org.simantics.animation.stubs.Interpolator[3];\r
- org.simantics.animation.stubs.Interpolator[] specular = new org.simantics.animation.stubs.Interpolator[3];\r
- org.simantics.animation.stubs.Interpolator[] emissive = new org.simantics.animation.stubs.Interpolator[3];\r
-\r
- Builtins builtins = graph.getBuiltins();\r
-\r
- \r
- for (org.simantics.animation.stubs.Interpolator i : handled) {\r
- IEntity target = i.getTarget();\r
- //if (target.isInstanceOf(Resources.g3dResource.LocalOrientation)) {\r
- if (target.isInstanceOf(Resources.g3dResource.Orientation) && target.getRelatedObjects(Resources.g3dResource.LocalOrientationOf).size() == 1) {\r
- SlerpInterpolator si = new SlerpInterpolator((SlerpCurve)Resources.curveBuilder.loadInterpolator(i));\r
- si.setTarget(transform);\r
- this.animation.addInterpolator(si);\r
- } else if (target.isInstanceOf(builtins.Double)) {\r
- Resource targetResource = target.getResource();\r
- Collection<IEntity> p = target.getRelatedObjects(builtins.PropertyOf);\r
- if (p.size() == 1) {\r
- IEntity parent = p.iterator().next();\r
- //if (parent.isInstanceOf(Resources.g3dResource.LocalPosition)) {\r
- if (parent.isInstanceOf(Resources.g3dResource.Position) && parent.getRelatedObjects(Resources.g3dResource.LocalPositionOf).size() == 1) {\r
- if (parent.getSingleRelatedObject(Resources.g3dResource.HasX).getResource().equals(targetResource)) {\r
- pos[0] = i;\r
- } else if (parent.getSingleRelatedObject(Resources.g3dResource.HasY).getResource().equals(targetResource)) {\r
- pos[1] = i;\r
- } else if (parent.getSingleRelatedObject(Resources.g3dResource.HasZ).getResource().equals(targetResource)) {\r
- pos[2] = i;\r
- } else {\r
- ErrorLogger.getDefault().logWarning("Cannot map animation interpolator " + i.getResource() + " to target (Position ?)" + target.getResource(), null);\r
- }\r
- } else if (parent.isInstanceOf(Resources.g3dResource.Color)) {\r
- org.simantics.animation.stubs.Interpolator[] color = null;\r
- if (parent.isInstanceOf(Resources.g3dResource.Color) && parent.getRelatedObjects(Resources.g3dResource.AmbientColorOf).size() > 0) {\r
- color = ambient;\r
- } else if (parent.isInstanceOf(Resources.g3dResource.Color)&& parent.getRelatedObjects(Resources.g3dResource.DiffuseColorOf).size() > 0) {\r
- color = diffuse;\r
- } else if (parent.isInstanceOf(Resources.g3dResource.Color) && parent.getRelatedObjects(Resources.g3dResource.SpecularColorOf).size() > 0) {\r
- color = specular;\r
- } else if (parent.isInstanceOf(Resources.g3dResource.Color) && parent.getRelatedObjects(Resources.g3dResource.EmissiveColorOf).size() > 0) {\r
- color = emissive;\r
- } else {\r
- ErrorLogger.getDefault().logWarning("Cannot map animation interpolator " + i.getResource() + " to target (Color)" + target.getResource() + " unknown color type", null);\r
- }\r
- if (color != null) {\r
- if (parent.getSingleRelatedObject(Resources.g3dResource.HasRed).getResource().equals(targetResource)) {\r
- color[0] = i;\r
- } else if (parent.getSingleRelatedObject(Resources.g3dResource.HasGreen).getResource().equals(targetResource)) {\r
- color[1] = i;\r
- } else if (parent.getSingleRelatedObject(Resources.g3dResource.HasBlue).getResource().equals(targetResource)) {\r
- color[2] = i;\r
- } else {\r
- ErrorLogger.getDefault().logWarning(\r
- "Cannot map animation interpolator " + i.getResource()\r
- + " to target (Color ?)" + target.getResource(), null);\r
- }\r
- }\r
- } else if (parent.isInstanceOf(Resources.g3dResource.Material)) {\r
- // TODO : transparency or shininess \r
- } else {\r
- ErrorLogger.getDefault().logWarning("Cannot map animation interpolator " + i.getResource() + " to target" + target.getResource() + " adding it to precalculated interpolators", null);\r
- precalculated.add(i);\r
- }\r
- } else {\r
- if (p.size() == 0) {\r
- ErrorLogger.getDefault().logWarning("Cannot map animation interpolator " + i.getResource() + " to target (Double)" + target.getResource() + " since it is not a part of a property", null);\r
- } else {\r
- ErrorLogger.getDefault().logWarning("Cannot map animation interpolator " + i.getResource() + " to target (Double)" + target.getResource() + " since it acts as a property to more than one entity", null); \r
- }\r
- }\r
- } else {\r
- ErrorLogger.getDefault().logWarning("Cannot map animation interpolator " + i.getResource() + " to target" + target.getResource(), null);\r
- }\r
- }\r
- \r
- if (pos[0] != null || pos[1] != null || pos[2] != null) {\r
- ScalarInterpolator xIp;\r
- ScalarInterpolator yIp;\r
- ScalarInterpolator zIp;\r
- if (pos[0] != null) {\r
- xIp = new TCBInterpolator((TCBCurve)Resources.curveBuilder.loadInterpolator(pos[0]));\r
- } else {\r
- xIp = new ConstantInterpolator(shape.getLocalPosition().getX()[0]);\r
- }\r
- if (pos[1] != null) {\r
- yIp = new TCBInterpolator((TCBCurve)Resources.curveBuilder.loadInterpolator(pos[1]));\r
- } else {\r
- yIp = new ConstantInterpolator(shape.getLocalPosition().getY()[0]);\r
- }\r
- if (pos[2] != null) {\r
- zIp = new TCBInterpolator((TCBCurve)Resources.curveBuilder.loadInterpolator(pos[2]));\r
- } else {\r
- zIp = new ConstantInterpolator(shape.getLocalPosition().getZ()[0]);\r
- }\r
- ChanneledPositionInterpolator ip = new ChanneledPositionInterpolator(xIp,yIp,zIp);\r
- ip.setTarget(transform);\r
- this.animation.addInterpolator(ip);\r
- \r
- } \r
- addColorInterpolator(shape, ambient, ChanneledColorInterpolator.AMBIENT);\r
- addColorInterpolator(shape, diffuse, ChanneledColorInterpolator.DIFFUSE);\r
- addColorInterpolator(shape, emissive, ChanneledColorInterpolator.EMISSIVE);\r
- addColorInterpolator(shape, specular, ChanneledColorInterpolator.SPECULAR);\r
- \r
- if (precalculated.size() == 0) {\r
- preCalc = null;\r
- } else {\r
- preCalc = new Geometry[preCalcSteps+1];\r
- for (int i = 0; i <= preCalcSteps; i++) {\r
- double delta = ((double)i / (double)preCalcSteps);\r
- // TODO : copy-paste from CSGAnimatorView\r
- // FIXME : does not update transformations (since ContextGraph does not support queries for context dependent values)\r
- for (Interpolator ip : precalculated) {\r
- if (ip.isInstanceOf(Resources.animationResource.ScalarInterpolator)) {\r
- // TODO : creating curve each time when time is set is slow.\r
- // Curve should be cached\r
- TCBCurve c = (TCBCurve)Resources.curveBuilder.loadInterpolator(ip);\r
- double out = c.evaluate(delta);\r
- //Double d = DoubleFactory.create(ip.getTarget());\r
- //d.setValue(new double[]{out});\r
- IEntity d = ip.getTarget();\r
- d.toProperty().setDoubleArray(new double[]{out});\r
- } else if (ip.isInstanceOf(Resources.animationResource.SlerpInterpolator)) {\r
- // TODO : creating curve each time when time is set is slow.\r
- // Curve should be cached\r
- SlerpCurve c = (SlerpCurve)Resources.curveBuilder.loadInterpolator(ip);\r
- Quat4d out = c.evaluate(delta);\r
- Orientation r = new Orientation(ip.getTarget());\r
- AxisAngle4d aa = new AxisAngle4d();\r
- aa.set(out);\r
- G3DTools.setOrientation(r, aa);\r
- }\r
- }\r
- preCalc[i] = getGeometry(graph,false)[0];\r
- preCalc[i].setIsCollidable(false);\r
- AppearanceTools.copyMaterial(mesh, preCalc[i]);\r
- }\r
- \r
- // We'll have to remove original (non-animated) shape from the node\r
- mesh.removeFromParent();\r
- body.attachChild(preCalc[0]);\r
- \r
- }\r
- return true;\r
- }\r
- \r
- private void addColorInterpolator(G3DNode shape, org.simantics.animation.stubs.Interpolator[] color, int type) {\r
- if (color[0] != null || color[1] != null || color[2] != null) {\r
- ScalarInterpolator xIp;\r
- ScalarInterpolator yIp;\r
- ScalarInterpolator zIp;\r
- Color col = null;\r
- Collection<IEntity> appearanceResource = shape.getRelatedObjects(Resources.g3dResource.HasAppearance);\r
- if (appearanceResource.size() == 0) {\r
- ErrorLogger.getDefault().logWarning("Cannot create interpolator for color because shape " + shape.getResource() + " has no appearance", null);\r
- }\r
- Appearance a = new Appearance(shape.getGraph(),appearanceResource.iterator().next().getResource());\r
- switch (type) {\r
- case ChanneledColorInterpolator.AMBIENT:\r
- col = a.getMaterial().getAmbientColor();\r
- break;\r
- case ChanneledColorInterpolator.DIFFUSE:\r
- col = a.getMaterial().getDiffuseColor();\r
- break;\r
- case ChanneledColorInterpolator.EMISSIVE:\r
- col = a.getMaterial().getEmissiveColor();\r
- break;\r
- case ChanneledColorInterpolator.SPECULAR:\r
- col = a.getMaterial().getSpecularColor();\r
- break;\r
- default:\r
- ErrorLogger.defaultLogError("Unknown color type", null);\r
- return;\r
- }\r
-\r
- if (color[0] != null) {\r
- xIp = new TCBInterpolator((TCBCurve)Resources.curveBuilder.loadInterpolator(color[0]));//CurveUtils.loadCurve(color[0].getResource()));\r
- } else {\r
- xIp = new ConstantInterpolator(col.getRed()[0]);\r
- }\r
- if (color[1] != null) {\r
- yIp = new TCBInterpolator((TCBCurve)Resources.curveBuilder.loadInterpolator(color[1]));//CurveUtils.loadCurve(color[1].getResource()));\r
- } else {\r
- yIp = new ConstantInterpolator(col.getGreen()[0]);\r
- }\r
- if (color[1] != null) {\r
- zIp = new TCBInterpolator((TCBCurve)Resources.curveBuilder.loadInterpolator(color[2]));//CurveUtils.loadCurve(color[2].getResource()));\r
- } else {\r
- zIp = new ConstantInterpolator(col.getBlue()[0]);\r
- }\r
- ChanneledColorInterpolator ip = new ChanneledColorInterpolator(xIp,yIp,zIp);\r
- ip.setType(type);\r
- ip.setTarget(mesh.getRenderState(RenderState.RS_MATERIAL));\r
- this.animation.addInterpolator(ip);\r
- } \r
- }\r
- \r
- public boolean setRandomAnimation(Graph graph) {\r
- return false;\r
- }\r
- \r
- public void dispose() {\r
-// mesh.clearBuffers();\r
-// mesh.clearBatches();\r
-// lines.clearBuffers();\r
-// lines.clearBatches();\r
- if (mesh != null) {\r
- mesh.removeFromParent();\r
- mesh.dispose();\r
- mesh = null;\r
- }\r
- if (lines != null) {\r
- lines.removeFromParent();\r
- lines.dispose();\r
- lines = null;\r
- }\r
- super.dispose();\r
- }\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapes;\r
-\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.renderer.Renderer;\r
-import com.jme.scene.Geometry;\r
-import com.jme.scene.Line;\r
-import com.jme.scene.state.MaterialState;\r
-import com.jme.util.geom.BufferUtils;\r
-\r
-public class AxesShape {\r
- \r
-\r
- public static Geometry getShape(Renderer renderer) {\r
- float[] coords = new float[]{0.f,0.f,0.f,\r
- 1.f,0.f,0.f,\r
- 0.f,0.f,0.f,\r
- 0.f,1.f,0.f,\r
- 0.f,0.f,0.f,\r
- 0.f,0.f,1.f};\r
- float colors[] = new float[]{1.f,0.f,0.f,0.f,\r
- 1.f,0.f,0.f,0.f,\r
- 0.f,1.f,0.f,0.f,\r
- 0.f,1.f,0.f,0.f,\r
- 0.f,0.f,1.f,0.f,\r
- 0.f,0.f,1.f,0.f};\r
- \r
-\r
- Line shape = new Line("",BufferUtils.createFloatBuffer(coords),null,BufferUtils.createFloatBuffer(colors),null);\r
- shape.setMode(Line.SEGMENTS);\r
- shape.setIsCollidable(false);\r
- shape.setLineWidth(3.f);\r
- MaterialState ms = renderer.createMaterialState();\r
- ms.setColorMaterial(MaterialState.CM_EMISSIVE);\r
- ms.setEmissive(new ColorRGBA(1.f,1.f,1.f,1.f));\r
- shape.setRenderState(ms);\r
- \r
- return shape;\r
- \r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapes;\r
-\r
-import java.net.URL;\r
-\r
-import org.eclipse.core.runtime.FileLocator;\r
-import org.eclipse.core.runtime.Path;\r
-\r
-import com.jme.image.Texture;\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.renderer.Renderer;\r
-import com.jme.scene.Geometry;\r
-import com.jme.scene.TriMesh;\r
-import com.jme.scene.state.MaterialState;\r
-import com.jme.scene.state.TextureState;\r
-import com.jme.util.TextureManager;\r
-import com.jme.util.geom.BufferUtils;\r
-\r
-public class FloorShape {\r
- \r
- private static String textureLocation = "src/jmetest/data/texture/Detail.jpg";\r
-\r
- public static Geometry getShape(Renderer renderer, float size, float texScale) {\r
-\r
- float coords[] = new float[3 * 4];\r
- float normals[] = new float[3 * 4];\r
- float texcoords[] = new float[2 * 4];\r
- int indices[] = new int[] { 0, 2, 1, 1, 2, 3 };\r
- coords[0] = -size;\r
- coords[1] = 0.f;\r
- coords[2] = -size;\r
- coords[3] = size;\r
- coords[4] = 0.f;\r
- coords[5] = -size;\r
- coords[6] = -size;\r
- coords[7] = 0.f;\r
- coords[8] = size;\r
- coords[9] = size;\r
- coords[10] = 0.f;\r
- coords[11] = size;\r
- texcoords[0] = -size*texScale;\r
- texcoords[1] = -size*texScale;\r
- texcoords[2] = size*texScale;\r
- texcoords[3] = -size*texScale;\r
- texcoords[4] = -size*texScale;\r
- texcoords[5] = size*texScale;\r
- texcoords[6] = size*texScale;\r
- texcoords[7] = size*texScale;\r
- normals[0] = 0.f;\r
- normals[1] = 1.f;\r
- normals[2] = 0.f;\r
- normals[3] = 0.f;\r
- normals[4] = 1.f;\r
- normals[5] = 0.f;\r
- normals[6] = 0.f;\r
- normals[7] = 1.0f;\r
- normals[8] = 0.f;\r
- normals[9] = 0.f;\r
- normals[10] = 1.f;\r
- normals[11] = 0.f;\r
- \r
- TriMesh shape = new TriMesh("",BufferUtils.createFloatBuffer(coords),BufferUtils.createFloatBuffer(normals),null,BufferUtils.createFloatBuffer(texcoords),BufferUtils.createIntBuffer(indices));\r
- MaterialState ms = renderer.createMaterialState();\r
- ms.setEmissive(new ColorRGBA(0.5f,0.5f,0.5f,0.f));\r
- ms.setDiffuse(new ColorRGBA(1.f,1.f,1.f,0.f));\r
- ms.setShininess(128.f);\r
- shape.setRenderState(ms);\r
- shape.setCullMode(Geometry.CULL_NEVER);\r
-\r
- TextureState ts = renderer.createTextureState();\r
- URL url = FileLocator.find(com.jme.eclipse.Activator.getDefault().getBundle(),new Path(textureLocation),null);\r
- Texture tex = TextureManager.loadTexture(url, Texture.MM_LINEAR_LINEAR,\r
- Texture.FM_LINEAR);\r
- tex.setWrap(Texture.WM_WRAP_S_WRAP_T);\r
- ts.setTexture(tex);\r
- shape.setRenderState(ts);\r
- shape.lockShadows();\r
- return shape;\r
- \r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapes;\r
-\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.renderer.Renderer;\r
-import com.jme.scene.Geometry;\r
-import com.jme.scene.Line;\r
-import com.jme.scene.state.MaterialState;\r
-import com.jme.util.geom.BufferUtils;\r
-\r
-public class GridShape {\r
- \r
- \r
- public static Geometry getShape(Renderer renderer, int lineCount, float delta) {\r
- \r
- float[] coords = new float[lineCount*lineCount*2*3];\r
- float size = delta * lineCount;\r
- float halfSize = size * 0.5f;\r
- \r
- for (int i = 0 ; i <= lineCount; i++) {\r
- int index = i*3*2;\r
- coords[index++] = -halfSize + i * delta;\r
- coords[index++] = 0.f;\r
- coords[index++] = -halfSize;\r
- coords[index++] = -halfSize + i * delta;\r
- coords[index++] = 0.f;\r
- coords[index++] = +halfSize;\r
- }\r
- for (int i = 0 ; i <= lineCount; i++) {\r
- int index = (i + lineCount + 1)*3*2;\r
- coords[index++] = -halfSize;\r
- coords[index++] = 0.f;\r
- coords[index++] = -halfSize + i * delta;\r
- coords[index++] = +halfSize;\r
- coords[index++] = 0.f;\r
- coords[index++] = -halfSize + i * delta;\r
- }\r
-\r
- Line shape = new Line("",BufferUtils.createFloatBuffer(coords),null,null,null);\r
- MaterialState ms = renderer.createMaterialState();\r
- ms.setEmissive(new ColorRGBA(1.f,1.f,1.f,0.f));\r
- shape.setRenderState(ms);\r
- shape.setCullMode(Geometry.CULL_NEVER);\r
- return shape;\r
- \r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.shapes;\r
-\r
-import java.nio.FloatBuffer;\r
-\r
-import com.jme.math.Vector3f;\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.scene.TriMesh;\r
-import com.jme.scene.batch.TriangleBatch;\r
-import com.jme.util.geom.BufferUtils;\r
-\r
-public class Quad extends TriMesh {\r
-\r
- private static final long serialVersionUID = 1L;\r
-\r
- public Quad() {\r
- \r
- }\r
- \r
- /**\r
- * Constructor creates a new <code>Quad</code> object. That data for the\r
- * <code>Quad</code> is not set until a call to <code>initialize</code>\r
- * is made.\r
- * \r
- * @param name\r
- * the name of this <code>Quad</code>.\r
- */\r
- public Quad(String name) {\r
- super(name);\r
- }\r
-\r
- /**\r
- * Constructor creates a new <code>Quade</code> object with the provided\r
- * width and height.\r
- * \r
- * @param name\r
- * the name of the <code>Quad</code>.\r
- * @param width\r
- * the width of the <code>Quad</code>.\r
- * @param height\r
- * the height of the <code>Quad</code>.\r
- */\r
- public Quad(String name, float width, float height) {\r
- super(name);\r
- initialize(width, height);\r
- }\r
-\r
- /**\r
- * <code>resize</code> changes the width and height of the given quad by\r
- * altering its vertices.\r
- * \r
- * @param width\r
- * the new width of the <code>Quad</code>.\r
- * @param height\r
- * the new height of the <code>Quad</code>.\r
- */\r
- public void resize(float width, float height) {\r
- TriangleBatch batch = getBatch(0);\r
- batch.getVertexBuffer().clear();\r
- batch.getVertexBuffer().put(-width / 2f).put(height / 2f).put(0);\r
- batch.getVertexBuffer().put(-width / 2f).put(-height / 2f).put(0);\r
- batch.getVertexBuffer().put(width / 2f).put(-height / 2f).put(0);\r
- batch.getVertexBuffer().put(width / 2f).put(height / 2f).put(0);\r
- }\r
-\r
- /**\r
- * \r
- * <code>initialize</code> builds the data for the <code>Quad</code>\r
- * object.\r
- * \r
- * \r
- * @param width\r
- * the width of the <code>Quad</code>.\r
- * @param height\r
- * the height of the <code>Quad</code>.\r
- */\r
- public void initialize(float width, float height) {\r
- TriangleBatch batch = getBatch(0);\r
- batch.setVertexCount(4);\r
- batch.setVertexBuffer(BufferUtils.createVector3Buffer(batch.getVertexCount()));\r
- batch.setNormalBuffer(BufferUtils.createVector3Buffer(batch.getVertexCount()));\r
- FloatBuffer tbuf = BufferUtils.createVector2Buffer(batch.getVertexCount());\r
- setTextureBuffer(0,tbuf);\r
- batch.setTriangleQuantity(2);\r
- batch.setIndexBuffer(BufferUtils.createIntBuffer(batch.getTriangleCount() * 3));\r
-\r
- batch.getVertexBuffer().put(-width / 2f).put(height / 2f).put(0);\r
- batch.getVertexBuffer().put(-width / 2f).put(-height / 2f).put(0);\r
- batch.getVertexBuffer().put(width / 2f).put(-height / 2f).put(0);\r
- batch.getVertexBuffer().put(width / 2f).put(height / 2f).put(0);\r
-\r
- batch.getNormalBuffer().put(0).put(0).put(1);\r
- batch.getNormalBuffer().put(0).put(0).put(1);\r
- batch.getNormalBuffer().put(0).put(0).put(1);\r
- batch.getNormalBuffer().put(0).put(0).put(1);\r
-\r
- \r
- tbuf.put(0).put(0);\r
- tbuf.put(0).put(1);\r
- tbuf.put(1).put(1);\r
- tbuf.put(1).put(0);\r
-\r
- setDefaultColor(ColorRGBA.white);\r
-\r
- batch.getIndexBuffer().put(0);\r
- batch.getIndexBuffer().put(1);\r
- batch.getIndexBuffer().put(2);\r
- batch.getIndexBuffer().put(0);\r
- batch.getIndexBuffer().put(2);\r
- batch.getIndexBuffer().put(3);\r
- }\r
-\r
- /**\r
- * <code>getCenter</code> returns the center of the <code>Quad</code>.\r
- * \r
- * @return Vector3f the center of the <code>Quad</code>.\r
- */\r
- public Vector3f getCenter() {\r
- return worldTranslation;\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.tools;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-import org.eclipse.jface.viewers.ISelectionChangedListener;\r
-import org.eclipse.jface.viewers.IStructuredSelection;\r
-import org.eclipse.jface.viewers.SelectionChangedEvent;\r
-import org.simantics.layer0.utils.viewpoints.TraversalPath;\r
-import org.simantics.proconf.browsing.MutableCachedGraphTreeNode;\r
-\r
-/**\r
- * SelectionListener for OntologyExplorer\r
- * \r
- * Returns Selection as TraversalPath\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public abstract class OEPathSelectionListener implements ISelectionChangedListener{\r
- @SuppressWarnings("unchecked")\r
- public void selectionChanged(SelectionChangedEvent event) {\r
- IStructuredSelection s = (IStructuredSelection)event.getSelection();\r
- List<TraversalPath> paths = new ArrayList<TraversalPath>();\r
- Iterator<MutableCachedGraphTreeNode> i = s.iterator();\r
- while(i.hasNext()) {\r
- MutableCachedGraphTreeNode node = i.next();\r
- TraversalPath path = (TraversalPath)node.getObject();\r
- paths.add(path);\r
- } \r
- pathSelectionUpdated(paths);\r
- }\r
- \r
- protected abstract void pathSelectionUpdated(List<TraversalPath> paths);\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.tools;\r
-\r
-import java.util.Iterator;\r
-\r
-import org.eclipse.jface.viewers.ISelectionChangedListener;\r
-import org.eclipse.jface.viewers.IStructuredSelection;\r
-import org.eclipse.jface.viewers.SelectionChangedEvent;\r
-import org.simantics.db.Resource;\r
-import org.simantics.proconf.browsing.providers.TreeObject;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-\r
-/**\r
- * SelectionListener for OntologyExplorer\r
- * \r
- * Returns selection as StrcturedResourceSelection\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public abstract class OESelectionListener implements ISelectionChangedListener { \r
- @SuppressWarnings("unchecked")\r
- public void selectionChanged(SelectionChangedEvent event) {\r
- IStructuredSelection s = (IStructuredSelection)event.getSelection();\r
- StructuredResourceSelection sel = new StructuredResourceSelection();\r
- Iterator<TreeObject> i = s.iterator();\r
- while(i.hasNext()) {\r
- TreeObject node = i.next();\r
- sel.add((Resource)node.getAdapter(Resource.class));\r
- }\r
- resourceSelectionUpdated(sel);\r
- }\r
- \r
- protected abstract void resourceSelectionUpdated(StructuredResourceSelection selection);\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.tools;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.List;\r
-\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.widgets.Display;\r
-import org.eclipse.swt.widgets.Tree;\r
-import org.eclipse.swt.widgets.TreeItem;\r
-import org.simantics.db.Builtins;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.ResourceDebugUtils;\r
-import org.simantics.layer0.utils.Statement;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-\r
-/**\r
- * PropertyTree finds common properties for set of objects, and\r
- * then based on user's selection returns all property instances.\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public class PropertyTree {\r
- private Tree tree;\r
- private Session session;\r
- \r
- \r
- public PropertyTree(Tree tree, Session session) {\r
- this.tree = tree;\r
- this.session = session;\r
- }\r
- \r
- public void setProperties(List<Resource> selectedInstances) {\r
- tree.removeAll();\r
- addProperties(null,selectedInstances);\r
- tree.redraw();\r
- }\r
- \r
- public void setProperties(StructuredResourceSelection selection) {\r
- ArrayList<Resource> selectedInstances = new ArrayList<Resource>();\r
- for (Resource r : selection.getSelectionList()) {\r
- if (!contains(selectedInstances,r)) {\r
- selectedInstances.add(r);\r
- \r
- //System.out.println("Added " + name.getName());\r
- } else {\r
- \r
- // System.out.println("Discarded " + name.getName());\r
- }\r
- }\r
- setProperties(selectedInstances);\r
- }\r
- \r
- public Tree getTree() {\r
- return tree;\r
- }\r
-\r
- private void addProperties(final TreeItem parent, final List<Resource> selectedInstances) {\r
- session.asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- Builtins builtins = g.getBuiltins();\r
- ArrayList<Resource> relationTypes = new ArrayList<Resource>();\r
- for (Resource resource : selectedInstances) {\r
- IEntity thing = EntityFactory.create(g, resource);\r
- \r
- Collection<Statement> properties = thing.getRelatedStatements(builtins.HasProperty);\r
- // RelationSet properties = resource.getRelatedResourcesWithRelationIds(GlobalIdMap.get(Builtins.HasProperty));\r
- \r
- for (Statement r : properties) {\r
- // Statement contains relation from instance to property(instance)\r
- // Find the property's type(s)\r
- // TODO : seems to be bad way of finding type\r
- Collection<IEntity> types = r.getObject().getRelatedObjects(builtins.InstanceOf);\r
- if (types.size() != 1)\r
- throw new UnsupportedOperationException("Cannot support multi-instances");\r
- IEntity type = types.iterator().next();\r
- if (!contains(relationTypes, r.getPredicate().getResource())) {\r
- \r
- if (type.isInheritedFrom(builtins.Double)) {\r
- \r
- relationTypes.add(r.getPredicate().getResource());\r
- \r
- //System.out.println("Added " + name.getName() + " " + type.getId() + " " + r.getRelationId() + " " + relationType.getId());\r
- final String name = getNameForThing(r.getPredicate());//getNameForThing(thing);\r
- final Object treeData = r.getPredicate().getResource();\r
- Display.getDefault().asyncExec(new Runnable() {\r
- //parent.getDisplay().asyncExec(new Runnable() {\r
- TreeItem item = null;\r
- @Override\r
- public void run() {\r
- if (parent != null)\r
- item = new TreeItem(parent,SWT.NONE);\r
- else\r
- item = new TreeItem(tree,SWT.NONE);\r
- item.setData(treeData);\r
- item.setText(name);\r
- \r
- }\r
- });\r
- \r
- } else {\r
- //Resource pproperties[] = r.getRelatedResources(GlobalIdMap.get(Builtins.PropertyRelationType));\r
- //Resource pproperties[] = resource.get(r.getObjectId()).getRelatedResources(GlobalIdMap.get(Builtins.HasProperty));\r
- Collection<IEntity> pproperties = r.getObject().getRelatedObjects(builtins.HasProperty);\r
- if (pproperties.size() > 0) {\r
- final ArrayList<Resource> list = new ArrayList<Resource>();\r
- list.add(r.getObject().getResource());\r
- \r
- final String name = getNameForThing(r.getPredicate());//getNameForThing(thing);\r
- final Object treeData = r.getPredicate().getResource();\r
- relationTypes.add(r.getPredicate().getResource());\r
- Display.getDefault().asyncExec(new Runnable() {\r
- //parent.getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- TreeItem item = null;\r
- if (parent != null)\r
- item = new TreeItem(parent, SWT.NONE);\r
- else\r
- item = new TreeItem(tree, SWT.NONE);\r
- item.setText(name);\r
- item.setData(treeData);\r
- addProperties(item,list);\r
- }\r
- });\r
- }\r
- }\r
- } \r
- }\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- }\r
- \r
- private String getNameForThing(IEntity thing) {\r
- return ResourceDebugUtils.getReadableNameForEntity(thing);\r
- /*\r
- String tName = thing.getName();\r
- if (tName == null) {\r
- Collection<Thing> ptypes = thing.getTypes();\r
- for (Thing pt : ptypes) {\r
- tName = pt.getName();\r
- if (tName != null)\r
- break;\r
- }\r
- }\r
- if (tName == null)\r
- return "Error / no name for " + thing;\r
- return tName;\r
- */\r
- }\r
- \r
- private boolean contains(java.util.List<Resource> list, Resource value) {\r
- for (int i = 0; i < list.size(); i++) {\r
- if (list.get(i).equals(value))\r
- return true;\r
- }\r
- return false;\r
- }\r
- \r
- /**\r
- * Returns all properties (instances) contained in the list depending on selection in the tree and \r
- * TODO : currently can be run only in UI -thread with transaction.\r
- * \r
- * @param graph\r
- * @param shapes\r
- * @return\r
- */\r
- public List<Resource> findLeafPropertyInstances(Graph graph,List<Resource> shapes) {\r
- TreeItem[] selectedProperties = tree.getSelection();\r
- List<Resource> props = new ArrayList<Resource>();\r
- for (TreeItem propertyItem : selectedProperties) {\r
- \r
- TreeItem t = propertyItem;\r
- boolean c = false;\r
- // if list contains treeNode's parent, node's property is already mapped / will be mapped later\r
- while (t.getParentItem() != null) {\r
- if (contains(selectedProperties, t.getParentItem())) {\r
- c = true;\r
- break;\r
- }\r
- t = t.getParentItem();\r
-\r
- }\r
- if (!c) {\r
- props.addAll(findLeafProperties(graph,shapes, propertyItem));\r
- }\r
- }\r
- return props;\r
- }\r
- \r
- public List<Resource> findPropertyInstances(Graph graph,List<Resource> shapes) {\r
- TreeItem[] selectedProperties = tree.getSelection();\r
- List<Resource> props = new ArrayList<Resource>();\r
- for (TreeItem propertyItem : selectedProperties) {\r
- \r
- TreeItem t = propertyItem;\r
- boolean c = false;\r
- // if list contains treeNode's parent, node's property is already mapped / will be mapped later\r
- while (t.getParentItem() != null) {\r
- if (contains(selectedProperties, t.getParentItem())) {\r
- c = true;\r
- break;\r
- }\r
- t = t.getParentItem();\r
-\r
- }\r
- if (!c) {\r
- props.addAll(findProperties(graph,shapes, propertyItem));\r
- }\r
- }\r
- return props;\r
- }\r
- \r
- private List<Resource> findProperties(Graph graph,java.util.List<Resource> shapes, TreeItem propertyItem) {\r
- ArrayList<Resource> propertyChain = new ArrayList<Resource>();\r
- TreeItem t = propertyItem;\r
- while (t != null) {\r
- propertyChain.add((Resource) t.getData());\r
- t = t.getParentItem();\r
- }\r
- \r
- return findProperties(graph,shapes,propertyChain);\r
- \r
- }\r
- \r
- private List<Resource> findLeafProperties(Graph graph,java.util.List<Resource> shapes, TreeItem propertyItem) {\r
- ArrayList<Resource> propertyChain = new ArrayList<Resource>();\r
- TreeItem t = propertyItem;\r
- while (t != null) {\r
- propertyChain.add((Resource)t.getData());\r
- t = t.getParentItem();\r
- }\r
- // now propertyChain contains property hierarchy from leaf to root\r
- //Long typeID = (Long) propertyItem.getData();\r
- if (propertyItem.getItemCount() == 0) { \r
- return findProperties(graph,shapes,propertyChain);\r
- } else {\r
- List<Resource> props = new ArrayList<Resource>();\r
- //Long typeID = (Long) propertyItem.getData();\r
- TreeItem children[] = propertyItem.getItems();\r
- //ArrayList<Resource> props = getPropertiesForType(shapes, typeID);\r
- for (TreeItem i : children)\r
- //mapProperty(parameter,props, i);\r
- props.addAll(findLeafProperties(graph,shapes, i));\r
- return props;\r
- }\r
- }\r
- \r
- private List<Resource> findProperties(Graph graph, java.util.List<Resource> shapes, ArrayList<Resource> propertyChain) {\r
- ArrayList<Resource> res = new ArrayList<Resource>(shapes);\r
- // propertyChain contains hierarhy of properties form leaf to root :\r
- // we'll find root property from shapes and then iterate each property instance\r
- // until we'll fin all requested properties (first element in property chain)\r
- \r
-// System.out.print("instances ");\r
-// for (Resource r : res) {\r
-// System.out.print(r + " ");\r
-// }\r
-// System.out.println();\r
- \r
- while (propertyChain.size() > 0) {\r
- res = getPropertiesForType(graph, res, propertyChain.get(propertyChain.size() - 1));\r
-// System.out.print(propertyChain.get(propertyChain.size() - 1) +" instances ");\r
-// for (Resource r : res) {\r
-// System.out.print(r + " ");\r
-// }\r
-// System.out.println();\r
- propertyChain.remove(propertyChain.size() - 1);\r
- }\r
- // now res contains all instances of requested property\r
- return res;\r
- }\r
- \r
- private ArrayList<Resource> getPropertiesForType(Graph graph,java.util.List<Resource> instances, Resource typeID) {\r
- ArrayList<Resource> properties = new ArrayList<Resource>();\r
- for (Resource instance : instances) {\r
- IEntity t = EntityFactory.create(graph,instance);\r
- Collection<IEntity> props = t.getRelatedObjects(typeID);\r
- for (IEntity p : props)\r
- properties.add(p.getResource());\r
- \r
- }\r
- return properties;\r
- }\r
- \r
- private boolean contains(TreeItem items[], TreeItem item) {\r
- for (TreeItem i : items)\r
- if (i.equals(item))\r
- return true;\r
- return false;\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.tools;\r
-\r
-import java.util.ArrayList;\r
-\r
-import com.jme.scene.Node;\r
-import com.jme.scene.Spatial;\r
-\r
-public class ScenegraphLockTraverser {\r
- Node root;\r
- boolean lock;\r
- public ScenegraphLockTraverser(Node root, boolean lock) {\r
- this.root = root;\r
- this.lock = lock;\r
- lock(root);\r
- }\r
- \r
- private void lock(Spatial spatial) {\r
- if (lock)\r
- spatial.lock();\r
- else\r
- spatial.unlock();\r
- if (spatial instanceof Node) {\r
- Node node = (Node)spatial;\r
- ArrayList<Spatial> children = node.getChildren();\r
- for (Spatial s : children) {\r
- s.lock();\r
- lock(s);\r
- }\r
- }\r
- \r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.views;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.Iterator;\r
-\r
-import org.eclipse.jface.viewers.ISelection;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.MouseAdapter;\r
-import org.eclipse.swt.events.MouseEvent;\r
-import org.eclipse.swt.events.SelectionAdapter;\r
-import org.eclipse.swt.events.SelectionEvent;\r
-import org.eclipse.swt.graphics.Color;\r
-import org.eclipse.swt.graphics.RGB;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.layout.GridLayout;\r
-import org.eclipse.swt.widgets.Button;\r
-import org.eclipse.swt.widgets.ColorDialog;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Slider;\r
-import org.eclipse.swt.widgets.Text;\r
-import org.eclipse.ui.IWorkbenchPart;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.StubLinkedList;\r
-import org.simantics.layer0.utils.internal.Entity;\r
-import org.simantics.proconf.g3d.Resources;\r
-import org.simantics.proconf.g3d.base.AppearanceTools;\r
-import org.simantics.proconf.g3d.stubs.Appearance;\r
-import org.simantics.proconf.g3d.stubs.ImageTexture;\r
-import org.simantics.proconf.g3d.stubs.Material;\r
-import org.simantics.proconf.g3d.stubs.MultiTexture;\r
-import org.simantics.proconf.g3d.stubs.Shader;\r
-import org.simantics.proconf.g3d.stubs.Texture;\r
-import org.simantics.proconf.g3d.stubs.TextureCoordinateGenerator;\r
-import org.simantics.proconf.image.ImageUtils;\r
-import org.simantics.proconf.image.interfaces.IImage;\r
-import org.simantics.proconf.image.interfaces.IImageFactory;\r
-import org.simantics.proconf.image.ui.ImageComposite;\r
-import org.simantics.proconf.ui.utils.ResourceAdaptionUtils;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-\r
-public class AppearanceEditor extends SinglePageResourceView{\r
-\r
- //Appearance appearance;\r
- Resource shapeResource;\r
- Resource appearanceResource;\r
- \r
- private enum EditorState{NONE,NO_SHAPE,NO_APPEARANCE, APPEARANCE};\r
- EditorState state = EditorState.NONE;\r
- \r
- Button materialButton;\r
- \r
- Composite ambientComposite;\r
- Composite diffuseComposite;\r
- Composite specularComposite;\r
- Composite emissiveComposite;\r
- Slider specularSlider;\r
- Slider transparencySlider;\r
- \r
- \r
- Composite textureParent;\r
- \r
- Button textureButton;\r
- Button addTextureButton;\r
- \r
- \r
- //Image image = null;\r
- \r
- boolean updating = false;\r
- \r
- private ArrayList<TextureComposite> textureComposites = new ArrayList<TextureComposite>();\r
- \r
- Button shaderButton;\r
- Text fragmentShaderText; \r
- Text vertexShaderText; \r
- \r
- Button apply3Button;\r
- Button apply2Button;\r
- Button applyButton;\r
- \r
- public AppearanceEditor() {\r
- super();\r
- //super(Activator.PLUGIN_ID);\r
- \r
- }\r
- \r
- @Override\r
- public void createPartControl(Composite parent) {\r
- super.createPartControl(parent);\r
- createWidgets();\r
- }\r
-\r
- @Override\r
- protected String getFormText() {\r
- return "Appearance Editor";\r
- }\r
-\r
-// @Override\r
-// protected void beforeCreateWidgets() {\r
-// if (!(getInputResource().isInstanceOf(GlobalIdMap.get(ThreeDimensionalModelingOntologyMapping.APPEARANCE))))\r
-// throw new RuntimeException("Trying to open resource that is not appearance");\r
-// appearance = AppearanceFactory.create(getInputResource());\r
-// }\r
- \r
- \r
-\r
- @Override\r
- protected void createWidgets() {\r
- \r
- if (shapeResource == null) {\r
- if (state != EditorState.NO_SHAPE) {\r
- clearForm();\r
- state = EditorState.NO_SHAPE;\r
- toolkit.createLabel(getBody(), "No shape selected");\r
- getActiveForm().layout(true, true);\r
- }\r
- } else if (appearanceResource == null){\r
- if (state != EditorState.NO_APPEARANCE) {\r
- clearForm();\r
- state = EditorState.NO_APPEARANCE;\r
- toolkit.createLabel(getBody(), "Selected shape does not have material definition.");\r
- Button b = toolkit.createButton(getBody(), "Create Appearance", SWT.PUSH);\r
- b.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- Appearance appearance = Appearance.createDefault(g);\r
- appearanceResource = appearance.getResource();\r
- g.addStatement(shapeResource, Resources.g3dResource.HasAppearance, appearanceResource);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- @Override\r
- public void requestCompleted( GraphRequestStatus status) {\r
- reloadInUIThread();\r
- }\r
- });\r
-\r
- }\r
- });\r
- getActiveForm().layout(true, true);\r
- }\r
- } else {\r
- if (state != EditorState.APPEARANCE) {\r
- clearForm();\r
- state = EditorState.APPEARANCE;\r
- createMaterialGroup(newGridSection(2, 2, false, false, "Material", "Material properties"));\r
- createTextureGroup(newGridSection(1, 1, false, false, "Texture", "Texture properties"));\r
- createShaderGroup(newGridSection(2, 2, false, false, "Shader", "Shader properties"));\r
- getActiveForm().layout(true, true);\r
- }\r
- \r
- }\r
- }\r
- \r
- @Override\r
- public void clearForm() {\r
- super.clearForm();\r
- textureComposites.clear();\r
- }\r
- \r
- @Override\r
- protected void pageSelectionChanged(IWorkbenchPart part, ISelection selection) {\r
- Resource res[] = ResourceAdaptionUtils.toResources(selection);\r
- if (res.length == 0) {\r
- shapeResource = null;\r
- appearanceResource = null;\r
- reload();\r
- return;\r
- }\r
- final Resource sel = res[0];\r
- if (sel.equals(shapeResource))\r
- return;\r
- //System.out.println("AppearanceEditor.pageSelectionChanged");\r
- getSession().asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- \r
- shapeResource = null;\r
- appearanceResource = null;\r
- // selected object must be a shape\r
- if (!g.isInstanceOf(sel, Resources.g3dResource.Shape)) {\r
- return GraphRequestStatus.transactionCancel();\r
- }\r
- // the shape must not be ah geometry definition\r
- if (g.getObjects(sel, Resources.g3dResource.GeometryDefinitionOf).size() > 0)\r
- return GraphRequestStatus.transactionCancel();\r
- \r
- shapeResource = sel;\r
- Collection<Resource> res = g.getObjects(shapeResource, Resources.g3dResource.HasAppearance);\r
- if (res.size() == 1)\r
- appearanceResource = res.iterator().next();\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- @Override\r
- public void requestCompleted(GraphRequestStatus status) {\r
- reloadInUIThread();\r
- }\r
- });\r
- }\r
- \r
- public void reloadInUIThread() {\r
- parent.getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- reload();\r
- }\r
- });\r
- }\r
- \r
- public void reload() {\r
- if (updating)\r
- return;\r
- createWidgets();\r
- if (state == EditorState.APPEARANCE) {\r
- getSession().asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- reload(g);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- }\r
- }\r
-\r
- @Override\r
- public void reload(Graph g) {\r
- if (updating)\r
- return;\r
- if (state != EditorState.APPEARANCE) {\r
- return;\r
- }\r
- Appearance appearance = new Appearance(g,appearanceResource);\r
- Material m = appearance.getMaterial();\r
- Texture t = appearance.getTexture();\r
- Shader s = appearance.getShader();\r
- loadMaterial(m);\r
- loadTexture(t);\r
- loadShader(s);\r
-\r
-\r
- }\r
- \r
- private void loadMaterial(Material m) {\r
- final boolean hasMaterial;\r
- final Color ambient;\r
- final Color diffuse;\r
- final Color specular;\r
- final Color emissive;\r
- final int shininess;\r
- final int transparency;\r
- if (m == null) {\r
- hasMaterial = false;\r
- ambient = null;\r
- diffuse = null;\r
- specular = null;\r
- emissive = null;\r
- shininess = 0;\r
- transparency = 0;\r
- } else {\r
- hasMaterial = true;\r
- ambient = AppearanceTools.getColor(m.getAmbientColor(), this.getBody().getDisplay());\r
- diffuse = AppearanceTools.getColor(m.getDiffuseColor(), this.getBody().getDisplay());\r
- specular = AppearanceTools.getColor(m.getSpecularColor(), this.getBody().getDisplay());\r
- emissive = AppearanceTools.getColor(m.getEmissiveColor(), this.getBody().getDisplay());\r
- shininess = (int)m.getShininess()[0];\r
- transparency = (int)(m.getTransparency()[0]*100.0);\r
- }\r
- parent.getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- boolean t = hasMaterial;\r
- materialButton.setSelection(t);\r
- ambientComposite.setEnabled(t);\r
- diffuseComposite.setEnabled(t);\r
- specularComposite.setEnabled(t);\r
- emissiveComposite.setEnabled(t);\r
- specularSlider.setEnabled(t);\r
- transparencySlider.setEnabled(t);\r
- if (hasMaterial) {\r
- ambientComposite.setBackground(ambient);\r
- diffuseComposite.setBackground(diffuse);\r
- specularComposite.setBackground(specular);\r
- emissiveComposite.setBackground(emissive);\r
- specularSlider.setSelection(shininess);\r
- transparencySlider.setSelection(transparency);\r
- } else {\r
- Color c = parent.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY);\r
- ambientComposite.setBackground(c);\r
- diffuseComposite.setBackground(c);\r
- specularComposite.setBackground(c);\r
- emissiveComposite.setBackground(c);\r
- }\r
- \r
- };\r
- });\r
- \r
- }\r
- \r
- private void loadTexture(Texture t) {\r
- //System.out.println("AppearanceEditor.loadTexture");\r
- if (t == null) {\r
- parent.getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- textureButton.setSelection(false);\r
- }\r
- });\r
- \r
- return;\r
- }\r
- parent.getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- textureButton.setSelection(true);\r
- }\r
- });\r
- \r
- if (t.isInstanceOf(Resources.g3dResource.ImageTexture)) {\r
- //final ImageTexture t2 = new ImageTexture(t);\r
- final Resource t2 = t.getResource();\r
- parent.getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- while (textureComposites.size() > 1) {\r
- textureComposites.remove(textureComposites.size()-1).dispose();\r
- }\r
- if (textureComposites.size() == 0) {\r
- textureComposites.add(new TextureComposite(textureParent,SWT.NONE));\r
- }\r
- getSession().asyncWrite(new GraphRequestAdapter() {\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- try {\r
- textureComposites.get(0).update(new ImageTexture(g,t2));\r
- } catch (Exception e) {\r
- ErrorLogger.defaultLogError(e);\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- };\r
- \r
- });\r
- }\r
- });\r
- \r
- \r
- } else if (t.isInstanceOf(Resources.g3dResource.MultiTexture)) {\r
- \r
- MultiTexture mt = new MultiTexture(t);\r
- StubLinkedList<IEntity> elements = new StubLinkedList<IEntity>(mt.getMultiTextureElementList());\r
- final Resource listResource = mt.getMultiTextureElementList().getResource();\r
- final int count = elements.size();\r
- parent.getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- while (textureComposites.size() > count) {\r
- textureComposites.get(textureComposites.size()-1).dispose();\r
- textureComposites.remove(textureComposites.size()-1);\r
- }\r
- while (textureComposites.size() < count) {\r
- textureComposites.add(new TextureComposite(textureParent,SWT.NONE));\r
- }\r
- getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g)\r
- throws Exception {\r
- StubLinkedList<IEntity> elements = new StubLinkedList<IEntity>(new Entity(g,listResource));\r
- Iterator<IEntity> i = elements.iterator();\r
- int index = 0;\r
- while (i.hasNext()) {\r
- //MultiTextureElement e = new MultiTextureElement(i.next());\r
- //int index = e.getMultiTextureIndexValue();\r
- Texture tex = new Texture(i.next());//e.getTexture();\r
- if (tex.isInstanceOf(Resources.g3dResource.ImageTexture)) {\r
- ImageTexture t2 = new ImageTexture(tex);\r
- try {\r
- textureComposites.get(index).update(t2);\r
- } catch (Exception err) {\r
- ErrorLogger.defaultLogError(err);\r
- }\r
- }\r
- index++;\r
- }\r
- return null;\r
- }\r
- });\r
- }\r
- });\r
- \r
- \r
- \r
- }\r
- }\r
- \r
- private void loadShader(Shader s) {\r
- final boolean hasShader = (s != null);\r
- final String vertexShader;\r
- final String fragmentShader;\r
- if (hasShader) {\r
- vertexShader = s.getVertexShader()[0];\r
- fragmentShader = s.getFragmentShader()[0];\r
- } else {\r
- vertexShader = null;\r
- fragmentShader = null;\r
- }\r
- parent.getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- if (!hasShader) {\r
- shaderButton.setSelection(false);\r
- } else {\r
- shaderButton.setSelection(true);\r
- vertexShaderText.setText(vertexShader);\r
- fragmentShaderText.setText(fragmentShader);\r
- }\r
- \r
- }\r
- });\r
- \r
- }\r
- \r
- private void createMaterialGroup(Composite parent) {\r
- toolkit.paintBordersFor(parent);\r
- toolkit.setBorderStyle(SWT.BORDER);\r
- \r
- materialButton = toolkit.createButton(parent, "Has Material", SWT.CHECK);\r
- materialButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- boolean t = materialButton.getSelection();\r
- ambientComposite.setEnabled(t);\r
- diffuseComposite.setEnabled(t);\r
- specularComposite.setEnabled(t);\r
- emissiveComposite.setEnabled(t);\r
- specularSlider.setEnabled(t);\r
- transparencySlider.setEnabled(t);\r
- \r
- }\r
- });\r
- GridData data = new GridData(GridData.FILL, GridData.FILL, false, false,2,1);\r
- materialButton.setLayoutData(data);\r
- \r
- data = new GridData(GridData.FILL, GridData.FILL, false, false,1,1);\r
- data.widthHint = 100;\r
- data.heightHint = 20;\r
-\r
- toolkit.createLabel(parent, "Ambient");\r
- ambientComposite = toolkit.createComposite(parent, SWT.BORDER);\r
- ambientComposite.setLayoutData(data);\r
- ambientComposite.addMouseListener(new MouseAdapter() {\r
- @Override\r
- public void mouseUp(MouseEvent e) {\r
- ColorDialog dialog = new ColorDialog(AppearanceEditor.this.getBody().getShell());\r
- RGB rgb = dialog.open();\r
- if (rgb != null) {\r
- ambientComposite.setBackground(new Color(AppearanceEditor.this.getBody().getDisplay(),rgb));\r
- \r
- }\r
- } \r
- });\r
-\r
- toolkit.createLabel(parent, "Diffuse");\r
- diffuseComposite = toolkit.createComposite(parent, SWT.BORDER);\r
- diffuseComposite.setLayoutData(data);\r
- diffuseComposite.addMouseListener(new MouseAdapter() {\r
- @Override\r
- public void mouseUp(MouseEvent e) {\r
- ColorDialog dialog = new ColorDialog(AppearanceEditor.this.getBody().getShell());\r
- RGB rgb = dialog.open();\r
- if (rgb != null) {\r
- diffuseComposite.setBackground(new Color(AppearanceEditor.this.getBody().getDisplay(),rgb));\r
- \r
- }\r
- } \r
- });\r
- toolkit.createLabel(parent, "Specular");\r
- specularComposite = toolkit.createComposite(parent, SWT.BORDER);\r
- specularComposite.setLayoutData(data);\r
- specularComposite.addMouseListener(new MouseAdapter() {\r
- @Override\r
- public void mouseUp(MouseEvent e) {\r
- ColorDialog dialog = new ColorDialog(AppearanceEditor.this.getBody().getShell());\r
- \r
- RGB rgb = dialog.open();\r
- if (rgb != null) {\r
- specularComposite.setBackground(new Color(AppearanceEditor.this.getBody().getDisplay(),rgb));\r
- \r
- }\r
- } \r
- });\r
- toolkit.createLabel(parent, "Emissive");\r
- emissiveComposite = toolkit.createComposite(parent, SWT.BORDER);\r
- emissiveComposite.setLayoutData(data);\r
- emissiveComposite.addMouseListener(new MouseAdapter() {\r
- @Override\r
- public void mouseUp(MouseEvent e) {\r
- ColorDialog dialog = new ColorDialog(AppearanceEditor.this.getBody().getShell());\r
- RGB rgb = dialog.open();\r
- if (rgb != null) {\r
- emissiveComposite.setBackground(new Color(AppearanceEditor.this.getBody().getDisplay(),rgb));\r
- \r
- }\r
- } \r
- });\r
- toolkit.createLabel(parent, "Shininess");\r
- specularSlider = new Slider(parent,SWT.NONE);\r
- specularSlider.setValues(20, 0, 255, 1, 1, 10);\r
- toolkit.adapt(specularSlider, true, true);\r
- toolkit.createLabel(parent, "Transparency");\r
- transparencySlider = new Slider(parent,SWT.NONE);\r
- transparencySlider.setValues(0, 0, 100, 1, 1, 10);\r
- toolkit.adapt(transparencySlider, true, true);\r
- apply2Button = toolkit.createButton(parent, "Apply", SWT.PUSH);\r
- apply2Button.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- convertMaterial();\r
- }\r
- });\r
- \r
- }\r
- \r
- private void createTextureGroup(Composite parent) {\r
- textureParent = parent;\r
- toolkit.paintBordersFor(parent);\r
- toolkit.setBorderStyle(SWT.BORDER);\r
- \r
- textureButton = toolkit.createButton(parent, "Has Texture", SWT.CHECK);\r
- textureButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- //loadImageButton.setEnabled(textureButton.getSelection());\r
- //imageComposite.setEnabled(textureButton.getSelection());\r
- //textureButton.setEnabled(textureButton.getSelection());\r
- \r
- }\r
- });\r
- \r
- \r
- \r
- textureButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- //loadImageButton.setEnabled(textureButton.getSelection());\r
- //imageComposite.setEnabled(textureButton.getSelection());\r
- //textureButton.setEnabled(textureButton.getSelection());\r
- \r
- }\r
- });\r
- addTextureButton = toolkit.createButton(parent, "Add Texture", SWT.PUSH);\r
- addTextureButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- textureComposites.add(new TextureComposite(textureParent,SWT.NONE));\r
- }\r
- });\r
- applyButton = toolkit.createButton(parent, "Apply", SWT.PUSH);\r
- applyButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- convertImage();\r
- }\r
- });\r
- \r
- }\r
- \r
- private void createShaderGroup(Composite parent) {\r
- toolkit.paintBordersFor(parent);\r
- toolkit.setBorderStyle(SWT.BORDER);\r
- GridData data = new GridData(SWT.FILL,SWT.FILL,true,true,2,1);\r
- shaderButton = toolkit.createButton(parent, "Has Shader", SWT.CHECK);\r
- shaderButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- \r
- \r
- }\r
- });\r
- shaderButton.setLayoutData(data);\r
- data = new GridData(SWT.FILL,SWT.FILL,true,true,1,1);\r
- data.widthHint = 400;\r
- data.heightHint = 200;\r
- toolkit.createLabel(parent, "Vertex Shader");\r
- vertexShaderText = toolkit.createText(parent,"", SWT.MULTI);\r
- vertexShaderText.setLayoutData(data);\r
- toolkit.createLabel(parent, "Fragment Shader");\r
- fragmentShaderText = toolkit.createText(parent,"", SWT.MULTI);\r
- fragmentShaderText.setLayoutData(data);\r
- apply3Button = toolkit.createButton(parent, "Apply", SWT.PUSH);\r
- apply3Button.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- convertShader();\r
- }\r
- });\r
- }\r
- \r
- \r
- \r
- private void convertShader() {\r
- updating = true;\r
- final boolean hasShader = shaderButton.getSelection();\r
- final String vertexShader = vertexShaderText.getText();\r
- final String fragmentShader = fragmentShaderText.getText();\r
- getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- Appearance appearance = new Appearance(g,appearanceResource);\r
- if (hasShader) {\r
- Shader s = appearance.getShader();\r
- if (s == null) {\r
- s = Shader.createDefault(g);\r
- appearance.setShader(s);\r
-\r
- }\r
- s.setVertexShader(vertexShader);\r
- s.setFragmentShader(fragmentShader);\r
- } else {\r
- appearance.setShader(null);\r
- }\r
- \r
- updating = false;\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- \r
- }\r
- \r
- private void convertMaterial() {\r
- updating = true;\r
- \r
- final boolean hasMaterial = materialButton.getSelection();\r
- final Color ambientColor = ambientComposite.getBackground();\r
- final Color diffuseColor = diffuseComposite.getBackground();\r
- final Color specularColor = specularComposite.getBackground();\r
- final Color emissiveColor = emissiveComposite.getBackground();\r
- final double shininess = (double)specularSlider.getSelection();\r
- final double transparency = (double)transparencySlider.getSelection()/ 100.0;\r
- \r
- getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- Appearance appearance = new Appearance(g,appearanceResource);\r
- if (hasMaterial) {\r
- Material m = appearance.getMaterial();\r
- if (m == null) {\r
- m = Material.createDefault(g);\r
- }\r
- org.simantics.proconf.g3d.stubs.Color aColor = m.getAmbientColor();\r
- org.simantics.proconf.g3d.stubs.Color dColor = m.getDiffuseColor();\r
- org.simantics.proconf.g3d.stubs.Color sColor = m.getSpecularColor();\r
- org.simantics.proconf.g3d.stubs.Color eColor = m.getEmissiveColor();\r
- AppearanceTools.setColor(aColor,ambientColor);\r
- AppearanceTools.setColor(dColor,diffuseColor);\r
- AppearanceTools.setColor(sColor, specularColor);\r
- AppearanceTools.setColor(eColor, emissiveColor);\r
- m.setShininess(shininess);\r
- m.setTransparency(transparency);\r
- appearance.setMaterial(m);\r
- } else {\r
- appearance.removeRelatedStatements(Resources.g3dResource.HasMaterial);\r
- }\r
- \r
- updating = false;\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- }\r
- \r
- private void convertImage() {\r
- updating = true;\r
- getSession().syncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- Appearance appearance = new Appearance(g,appearanceResource);\r
- Texture t = appearance.getTexture();\r
- if (textureComposites.size() == 1) {\r
- ImageTexture t2 = null;\r
- if (t != null && t.isInstanceOf(Resources.g3dResource.ImageTexture)) {\r
- t2 = new ImageTexture(t);\r
- } else {\r
- t2 = ImageTexture.createDefault(g);\r
- appearance.setTexture(t2);\r
- }\r
- final Resource mode = textureComposites.get(0).getModeType();\r
- \r
-\r
- if (mode != null)\r
- t2.setTextureMode(mode);\r
- textureComposites.get(0).getTexture(t2);\r
- \r
- } else if (textureComposites.size() > 1) {\r
- MultiTexture mt = null;\r
- if (t != null\r
- && t.isInstanceOf(Resources.g3dResource.MultiTexture)) {\r
- mt = new MultiTexture(t);\r
- } else {\r
- mt = MultiTexture.createDefault(g);\r
- appearance.setTexture(mt);\r
- }\r
- StubLinkedList<IEntity> elements = new StubLinkedList<IEntity>(mt.getMultiTextureElementList());\r
- //PropertyTypeSet<MultiTextureElement> elements = mt.getMultiTextureElementSet();\r
- Iterator<IEntity> it = elements.iterator();\r
- for (int i = 0; i < textureComposites.size(); i++) {\r
- TextureComposite tc = textureComposites.get(i);\r
- \r
- ImageTexture tex = null;\r
- if (it.hasNext())\r
- tex = new ImageTexture(it.next());\r
- else {\r
- tex = ImageTexture.createDefault(g);\r
- elements.add(i,tex);\r
- }\r
- Resource mode = tc.getModeType();\r
- if (mode == null)\r
- tex.setTextureMode(Resources.g3dResource.CombineMode_modulate);\r
- else\r
- tex.setTextureMode(mode);\r
- \r
- textureComposites.get(i).getTexture(tex);\r
- \r
- }\r
- } else {\r
- appearance.setTexture(null);\r
- }\r
- \r
- updating = false;\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- \r
- \r
- \r
- }\r
-\r
- private class TextureComposite extends Composite {\r
- private Button textureGeneratorButton;\r
- private Button sphereMapButton;\r
- private Button eyeLinearButton;\r
- private Button objectLinearButton;\r
- private Button normalMapButton;\r
- private Button reflectionMapButton;\r
- \r
- private Button modulateButton;\r
- private Button replaceButton;\r
- private Button decalButton;\r
- private Button blendButton;\r
- \r
- \r
- \r
- private Button loadImageButton;\r
- private ImageComposite imageComposite;\r
- private Button removeButton;\r
- \r
- \r
- public TextureComposite(Composite parent, int style) {\r
- super(parent,style);\r
- GridLayout layout = new GridLayout(2,false);\r
- this.setLayout(layout);\r
- \r
- loadImageButton = toolkit.createButton(this, "Load Texture", SWT.PUSH);\r
- loadImageButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
-\r
- IImage[] images = ImageUtils.loadImagesDialog(getSite().getShell(), false, ImageUtils.getImageFactories());\r
- if (images == null)\r
- return;\r
- IImage image = images[0];\r
- setImage(image);\r
-\r
- }\r
- });\r
- GridData data = new GridData(SWT.LEFT,SWT.FILL,false,false,2,1);\r
- \r
- loadImageButton.setLayoutData(data);\r
- data = new GridData(SWT.FILL,SWT.FILL,true,true,2,1);\r
- imageComposite = new ImageComposite(this,SWT.BORDER);\r
- imageComposite.setLayoutData(data);\r
- \r
- Composite texGenComposite = toolkit.createComposite(this, SWT.BORDER);\r
- layout = new GridLayout(1,false);\r
- texGenComposite.setLayout(layout);\r
- data = new GridData(SWT.FILL,SWT.FILL,true,true,1,1);\r
- data.heightHint = 140;\r
- texGenComposite.setLayoutData(data);\r
- textureGeneratorButton = toolkit.createButton(texGenComposite, "Has Texture Coordinate Generator", SWT.CHECK);\r
- textureGeneratorButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- sphereMapButton.setEnabled(textureGeneratorButton.getSelection());\r
- eyeLinearButton.setEnabled(textureGeneratorButton.getSelection());\r
- objectLinearButton.setEnabled(textureGeneratorButton.getSelection());\r
- normalMapButton.setEnabled(textureGeneratorButton.getSelection());\r
- reflectionMapButton.setEnabled(textureGeneratorButton.getSelection());\r
- \r
- }\r
- });\r
- \r
- sphereMapButton = toolkit.createButton(texGenComposite, "Shpere Map", SWT.RADIO);\r
- sphereMapButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- if (!sphereMapButton.getSelection()) {\r
- sphereMapButton.setSelection(true);\r
- } else {\r
- eyeLinearButton.setSelection(false);\r
- objectLinearButton.setSelection(false);\r
- normalMapButton.setSelection(false);\r
- reflectionMapButton.setSelection(false);\r
- }\r
- }\r
- });\r
- eyeLinearButton = toolkit.createButton(texGenComposite, "Eye Linear", SWT.RADIO);\r
- eyeLinearButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- if (!eyeLinearButton.getSelection()) {\r
- eyeLinearButton.setSelection(true);\r
- } else {\r
- sphereMapButton.setSelection(false);\r
- objectLinearButton.setSelection(false);\r
- normalMapButton.setSelection(false);\r
- reflectionMapButton.setSelection(false);\r
- }\r
- }\r
- });\r
- objectLinearButton = toolkit.createButton(texGenComposite, "Object Linear", SWT.RADIO);\r
- objectLinearButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- if (!objectLinearButton.getSelection()) {\r
- objectLinearButton.setSelection(true);\r
- } else {\r
- eyeLinearButton.setSelection(false);\r
- sphereMapButton.setSelection(false);\r
- normalMapButton.setSelection(false);\r
- reflectionMapButton.setSelection(false);\r
- }\r
- }\r
- });\r
- normalMapButton = toolkit.createButton(texGenComposite, "Normal Map", SWT.RADIO);\r
- normalMapButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- if (!normalMapButton.getSelection()) {\r
- normalMapButton.setSelection(true);\r
- } else {\r
- eyeLinearButton.setSelection(false);\r
- objectLinearButton.setSelection(false);\r
- sphereMapButton.setSelection(false);\r
- reflectionMapButton.setSelection(false);\r
- }\r
- }\r
- });\r
- reflectionMapButton = toolkit.createButton(texGenComposite, "Reflection Map", SWT.RADIO);\r
- reflectionMapButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- if (!reflectionMapButton.getSelection()) {\r
- reflectionMapButton.setSelection(true);\r
- } else {\r
- eyeLinearButton.setSelection(false);\r
- objectLinearButton.setSelection(false);\r
- normalMapButton.setSelection(false);\r
- sphereMapButton.setSelection(false);\r
- }\r
- }\r
- });\r
- \r
- Composite texModeComposite = toolkit.createComposite(this, SWT.BORDER);\r
- texModeComposite.setLayout(layout);\r
- texModeComposite.setLayoutData(data);\r
- modulateButton = toolkit.createButton(texModeComposite, "Modulate", SWT.RADIO);\r
- modulateButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- modulateButton.setSelection(true);\r
- replaceButton.setSelection(false);\r
- blendButton.setSelection(false);\r
- decalButton.setSelection(false);\r
-\r
- }\r
- });\r
- blendButton = toolkit.createButton(texModeComposite, "Blend", SWT.RADIO);\r
- blendButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- modulateButton.setSelection(false);\r
- replaceButton.setSelection(false);\r
- blendButton.setSelection(true);\r
- decalButton.setSelection(false);\r
-\r
- }\r
- });\r
- replaceButton = toolkit.createButton(texModeComposite, "Replace", SWT.RADIO);\r
- replaceButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- modulateButton.setSelection(false);\r
- replaceButton.setSelection(true);\r
- blendButton.setSelection(false);\r
- decalButton.setSelection(false);\r
-\r
- }\r
- });\r
- decalButton = toolkit.createButton(texModeComposite, "Decal", SWT.RADIO);\r
- decalButton.addSelectionListener(new SelectionAdapter() {\r
- public void widgetSelected(SelectionEvent e) {\r
- modulateButton.setSelection(false);\r
- replaceButton.setSelection(false);\r
- blendButton.setSelection(false);\r
- decalButton.setSelection(true);\r
-\r
- }\r
- });\r
- \r
- removeButton = toolkit.createButton(this, "Remove texture", SWT.PUSH);\r
- parent.getParent().getParent().layout(true, true);\r
- }\r
- \r
- public void setImage(IImage image) {\r
- imageComposite.setImage(image);\r
- }\r
- \r
- public IImage getImage() {\r
- return imageComposite.getImage();\r
- }\r
- \r
- public void update(ImageTexture t2) throws Exception {\r
- Graph graph = t2.getGraph();\r
- org.simantics.image.stubs.Image i = t2.getImage();\r
- IImageFactory f = ImageUtils.getImageFactoryForResource(graph,i.getResource());\r
- final IImage p = f.createImageForResource(graph,i.getResource());\r
-// PixelDimension pd = p.getDimensions().getPixelDimension();\r
-// if (pd==null) pd = AppearanceTools.DEFAULT_SIZE;\r
-// final ImageData id = p.rasterize(pd.getWidth(), pd.getHeight());\r
- \r
- parent.getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- //Image im = new Image(AppearanceEditor.this.getBody().getDisplay(),id);\r
- //imageComposite.setImage(im);\r
- //showImage();\r
- setImage(p);\r
-\r
- }\r
- });\r
- \r
- TextureCoordinateGenerator gen = t2.getTextureCoordinateGenerator();\r
- final boolean tg;\r
- final boolean sm;\r
- final boolean el;\r
- final boolean ol;\r
- final boolean nm;\r
- final boolean rm;\r
- if (gen == null) {\r
- tg = false;\r
- sm = false;\r
- el = false;\r
- ol = false;\r
- nm = false;\r
- rm = false;\r
- } else {\r
- //type = gen.getTextureCoordinateGeneratorTypeValue();\r
- //textureGeneratorButton.setSelection(true);\r
- tg = true;\r
- if (gen.equals(Resources.g3dResource.TextureCoordinateGenerator_sphere)) {\r
- sm = true;\r
- el = false;\r
- ol = false;\r
- nm = false;\r
- rm = false;\r
- } else if (gen.equals(Resources.g3dResource.TextureCoordinateGenerator_eyelinear)) {\r
- sm = false;\r
- el = true;\r
- ol = false;\r
- nm = false;\r
- rm = false;\r
- } else if (gen.equals(Resources.g3dResource.TextureCoordinateGenerator_objectlinear)) {\r
- sm = false;\r
- el = false;\r
- ol = true;\r
- nm = false;\r
- rm = false;\r
- } else if (gen.equals(Resources.g3dResource.TextureCoordinateGenerator_normal)) {\r
- sm = false;\r
- el = false;\r
- ol = false;\r
- nm = true;\r
- rm = false;\r
- } else if (gen.equals(Resources.g3dResource.TextureCoordinateGenerator_reflection)) {\r
- sm = false;\r
- el = false;\r
- ol = false;\r
- nm = false;\r
- rm = true;\r
- } else {\r
- sm = false;\r
- el = false;\r
- ol = false;\r
- nm = false;\r
- rm = false;\r
- }\r
- \r
- }\r
- \r
- parent.getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- textureGeneratorButton.setSelection(tg);\r
- sphereMapButton.setSelection(sm);\r
- eyeLinearButton.setSelection(el);\r
- objectLinearButton.setSelection(ol);\r
- normalMapButton.setSelection(nm);\r
- reflectionMapButton.setSelection(rm);\r
- sphereMapButton.setEnabled(textureGeneratorButton.getSelection());\r
- eyeLinearButton.setEnabled(textureGeneratorButton.getSelection());\r
- objectLinearButton.setEnabled(textureGeneratorButton.getSelection());\r
- normalMapButton.setEnabled(textureGeneratorButton.getSelection());\r
- reflectionMapButton.setEnabled(textureGeneratorButton.getSelection());\r
- \r
- }\r
- });\r
- }\r
- \r
- \r
- public Resource getGenType() {\r
- if (sphereMapButton.getSelection())\r
- return Resources.g3dResource.TextureCoordinateGenerator_sphere;\r
- else if (eyeLinearButton.getSelection())\r
- return Resources.g3dResource.TextureCoordinateGenerator_eyelinear;\r
- else if (objectLinearButton.getSelection())\r
- return Resources.g3dResource.TextureCoordinateGenerator_objectlinear;\r
- else if (normalMapButton.getSelection())\r
- return Resources.g3dResource.TextureCoordinateGenerator_normal;\r
- else if (reflectionMapButton.getSelection())\r
- return Resources.g3dResource.TextureCoordinateGenerator_reflection;\r
- return null;\r
- }\r
- \r
- public Resource getModeType() {\r
- if (modulateButton.getSelection())\r
- return Resources.g3dResource.MultiTextureMode_modulate;\r
- else if (replaceButton.getSelection())\r
- return Resources.g3dResource.MultiTextureMode_replace;\r
- else if (blendButton.getSelection())\r
- return Resources.g3dResource.MultiTextureMode_blend;\r
- else if (decalButton.getSelection())\r
- return Resources.g3dResource.MultiTextureMode_decal;\r
-\r
- return null;\r
- }\r
- \r
- public void getTexture(ImageTexture t2) throws Exception{\r
- Graph g = t2.getGraph();\r
- IImage image = getImage();\r
- if (image != null) {\r
- Resource res = image.instantiateAsResource(g);\r
- t2.setImage(res);\r
- }\r
- final Resource t2res = t2.getResource();\r
-\r
- if (textureGeneratorButton.getSelection()) {\r
- final Resource type;\r
- if (sphereMapButton.getSelection())\r
- type = Resources.g3dResource.TextureCoordinateGenerator_sphere;\r
- else if (eyeLinearButton.getSelection())\r
- type = Resources.g3dResource.TextureCoordinateGenerator_eyelinear;\r
- else if (objectLinearButton.getSelection())\r
- type = Resources.g3dResource.TextureCoordinateGenerator_objectlinear;\r
- else if (normalMapButton.getSelection())\r
- type = Resources.g3dResource.TextureCoordinateGenerator_normal;\r
- else if (reflectionMapButton.getSelection())\r
- type = Resources.g3dResource.TextureCoordinateGenerator_reflection;\r
- else\r
- type = null;\r
- if (type != null) {\r
- getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g)\r
- throws Exception {\r
- ImageTexture t2 = new ImageTexture(g, t2res);\r
- t2.setTextureCoordinateGenerator(type);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
-\r
- }\r
-\r
- }\r
- }\r
- \r
- /*\r
- * public void getTexture(ImageTexture t2) { if\r
- * (imageComposite.getImage() != null) { ImageData data =\r
- * imageComposite.getImage().getImageData(); if (!data.palette.isDirect) {\r
- * throw new RuntimeException("Not direct"); } int bytes = 0; String\r
- * type = ""; if (data.depth != 32 && data.depth != 24) { throw new\r
- * UnsupportedOperationException("Cannot handle bitdepth " +\r
- * data.depth); } if (data.depth == 32) { bytes = 4; type = "RGBA"; }\r
- * else if (data.depth == 24) { bytes = 3; type = "RGB"; } String size =\r
- * data.width + " " + data.height; byte texturedata[] = new\r
- * byte[data.width * data.height * bytes]; for (int y = 0; y <\r
- * data.height; y++) { for (int x = 0; x < data.width; x++) { int index =\r
- * (y * data.width + x) * bytes;\r
- * \r
- * texturedata[index] = data.data[index]; texturedata[index + 1] =\r
- * data.data[index + 1]; texturedata[index + 2] = data.data[index + 2];\r
- * if (bytes == 4) texturedata[index + 3] = data.data[index + 3];\r
- * } } String base64 = new\r
- * sun.misc.BASE64Encoder().encode(texturedata); // if\r
- * (coreTC.getCurrentTransaction() == null)\r
- * \r
- * \r
- * \r
- * fi.vtt.proconf.threedimensionalmodeling.stub.v1_0.Image i =\r
- * t2.getImage(); if (i == null) { i = ImageFactory.instantiate(graph);\r
- * graph.commitChanges(this); t2.setImage(i); }\r
- * i.setImageDataValue(base64); i.setImageTypeValue(type);\r
- * i.setImageSizeValue(size); graph.commitChanges(this); if\r
- * (textureGeneratorButton.getSelection()) { type = null; if\r
- * (sphereMapButton.getSelection()) type =\r
- * AppearanceTools.TEXTURE_COORD_GEN_SPHERE; else if\r
- * (eyeLinearButton.getSelection()) type =\r
- * AppearanceTools.TEXTURE_COORD_GEN_EYE_LINEAR; else if\r
- * (objectLinearButton.getSelection()) type =\r
- * AppearanceTools.TEXTURE_COORD_GEN_OBJECT_LINEAR; else if\r
- * (normalMapButton.getSelection()) type =\r
- * AppearanceTools.TEXTURE_COORD_GEN_NORMAL; else if\r
- * (reflectionMapButton.getSelection()) type =\r
- * AppearanceTools.TEXTURE_COORD_GEN_REFLECTION; else type = null; if\r
- * (type != null) { TextureCoordinateGenerator gen =\r
- * t2.getTextureCoordinateGenerator(); if (gen == null) { gen =\r
- * TextureCoordinateGeneratorFactory.instantiate(graph);\r
- * graph.commitChanges(this); t2.setTextureCoordinateGenerator(gen); }\r
- * gen.setTextureCoordinateGeneratorTypeValue(type);\r
- * graph.commitChanges(this); }\r
- * } else { //t2.setTextureCoordinateGenerator(null);\r
- * graph.commitChanges(this); }\r
- * } }\r
- */\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.views;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-import org.eclipse.core.runtime.IAdaptable;\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.jface.action.IMenuManager;\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.eclipse.jface.resource.ImageDescriptor;\r
-import org.eclipse.jface.viewers.ITreeContentProvider;\r
-import org.eclipse.jface.viewers.LabelProvider;\r
-import org.eclipse.jface.viewers.TreeViewer;\r
-import org.eclipse.jface.viewers.Viewer;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.graphics.Image;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.ui.IActionBars;\r
-import org.eclipse.ui.IPartListener;\r
-import org.eclipse.ui.IWorkbenchPart;\r
-import org.eclipse.ui.IWorkbenchWindow;\r
-import org.eclipse.ui.PlatformUI;\r
-import org.eclipse.ui.part.ViewPart;\r
-import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;\r
-import org.eclipse.ui.views.properties.IPropertyDescriptor;\r
-import org.eclipse.ui.views.properties.IPropertySource;\r
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;\r
-import org.simantics.proconf.g3d.Activator;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorPart;\r
-import org.simantics.proconf.g3d.scenegraph.IGeometryNode;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.scenegraph.ISelectableNode;\r
-import org.simantics.utils.ui.gfx.ImageCache;\r
-\r
-import com.jme.scene.Geometry;\r
-import com.jme.scene.Node;\r
-import com.jme.scene.SceneElement;\r
-import com.jme.scene.Spatial;\r
-import com.jme.scene.batch.GeomBatch;\r
-\r
-public class ScenegraphViewPart extends ViewPart{\r
- \r
- private static final ImageDescriptor GEOMETRY_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/geometry.png");\r
- private static final ImageDescriptor BATCH_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/batch.png");\r
- private static final ImageDescriptor NODE_IMAGE = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/node.png");\r
- \r
- \r
- TreeViewer viewer;\r
- \r
- IPartListener listener;\r
- \r
- Action showJMEAction;\r
- \r
- @Override\r
- public void createPartControl(Composite parent) {\r
-\r
- viewer = new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL| SWT.V_SCROLL);\r
- viewer.setContentProvider(new GNScenegraphContentProvider());\r
- viewer.setLabelProvider(new GNScenegraphLabelProvider());\r
- getSite().setSelectionProvider(viewer);\r
- \r
- makeActions();\r
- \r
- IActionBars actionBar = getViewSite().getActionBars();\r
- contributeToActionBars(actionBar);\r
- \r
- listener = new IPartListener() {\r
- @Override\r
- public void partActivated(IWorkbenchPart part) {\r
- if (part instanceof ThreeDimensionalEditorPart) {\r
- ThreeDimensionalEditorPart p = (ThreeDimensionalEditorPart)part;\r
- Object newInput = p.getEditor();\r
- if (viewer.getInput() != newInput)\r
- viewer.setInput(newInput);\r
- } else {\r
- //viewer.setInput(null);\r
- }\r
- \r
- }\r
- \r
- @Override\r
- public void partBroughtToTop(IWorkbenchPart part) {\r
-\r
- }\r
- \r
- @Override\r
- public void partClosed(IWorkbenchPart part) {\r
-\r
- }\r
- \r
- @Override\r
- public void partDeactivated(IWorkbenchPart part) {\r
-\r
- }\r
- \r
- @Override\r
- public void partOpened(IWorkbenchPart part) {\r
-\r
- }\r
- };\r
- for (IWorkbenchWindow w : PlatformUI.getWorkbench().getWorkbenchWindows()) {\r
- w.getPartService().addPartListener(listener);\r
- \r
- }\r
- \r
- }\r
- \r
- protected void makeActions() {\r
- showJMEAction = new Action("jME",Action.AS_CHECK_BOX) {\r
- @Override\r
- public void run() {\r
- Object input = viewer.getInput();\r
- viewer.setInput(null);\r
- if (this.isChecked()) {\r
- viewer.setContentProvider(new JMEScenegraphContentProvider());\r
- viewer.setLabelProvider(new JMEScenegraphLabelProvider());\r
- } else {\r
- viewer.setContentProvider(new GNScenegraphContentProvider());\r
- viewer.setLabelProvider(new GNScenegraphLabelProvider());\r
- }\r
- viewer.setInput(input);\r
- }\r
- };\r
- }\r
- \r
- protected void contributeToActionBars(IActionBars bars) {\r
- fillLocalToolBar(bars.getToolBarManager());\r
- fillLocalPullDown(bars.getMenuManager());\r
- bars.updateActionBars();\r
- }\r
-\r
- protected void fillLocalToolBar(IToolBarManager manager) {\r
- manager.add(showJMEAction);\r
- }\r
-\r
- protected void fillLocalPullDown(IMenuManager manager) {\r
-\r
- }\r
- \r
- @Override\r
- public void setFocus() {\r
- viewer.getControl().setFocus();\r
- }\r
- \r
- public void dispose() {\r
- for (IWorkbenchWindow w : PlatformUI.getWorkbench().getWorkbenchWindows()) {\r
- w.getPartService().removePartListener(listener);\r
- \r
- }\r
- super.dispose();\r
- }\r
- \r
-\r
- private class JMEScenegraphContentProvider implements ITreeContentProvider {\r
- @Override\r
- public Object[] getChildren(Object parentElement) {\r
- if (parentElement instanceof JMEAdaptable)\r
- parentElement = ((JMEAdaptable)parentElement).getElement();\r
- \r
- if (parentElement instanceof Node) {\r
- Node n = (Node)parentElement;\r
- Object o[] = new Object[n.getChildren().size()];\r
- for (int i = 0; i < n.getChildren().size(); i++) {\r
- o[i] = new JMEAdaptable(n.getChild(i));\r
- }\r
- return o;\r
- }\r
- if (parentElement instanceof Geometry) {\r
- Geometry g = (Geometry)parentElement;\r
- Object o[] = new Object[g.getBatchCount()];\r
- for (int i = 0 ; i < g.getBatchCount(); i++)\r
- o[i] = new JMEAdaptable(g.getBatch(i));\r
- return o;\r
- }\r
- return null;\r
- }\r
- \r
- @Override\r
- public Object[] getElements(Object inputElement) {\r
- if (inputElement instanceof ThreeDimensionalEditorBase) {\r
- SceneElement root = ((ThreeDimensionalEditorBase)inputElement).getRenderingComponent().getRoot();\r
- if (root != null)\r
- return new Object[]{new JMEAdaptable(root)};\r
- }\r
- return new Object[0];\r
- }\r
- \r
- @Override\r
- public Object getParent(Object element) {\r
- SceneElement e;\r
- if (element instanceof JMEAdaptable)\r
- e = ((JMEAdaptable)element).getElement();\r
- else\r
- e = (SceneElement)element;\r
- if (e instanceof Spatial) {\r
- Spatial s = (Spatial)e;\r
- return s.getParent();\r
- } \r
- if (e instanceof GeomBatch) {\r
- GeomBatch g = (GeomBatch)e;\r
- return g.getParentGeom();\r
- }\r
- return null;\r
- }\r
- \r
- @Override\r
- public boolean hasChildren(Object element) {\r
- if (element instanceof JMEAdaptable)\r
- element = ((JMEAdaptable)element).getElement();\r
- if (element instanceof Node) {\r
- Node n = (Node)element;\r
- if (n.getChildren() == null)\r
- return false;\r
- return n.getChildren().size() > 0;\r
- }\r
- if (element instanceof Geometry) {\r
- Geometry g = (Geometry)element;\r
- return g.getBatchCount() > 0;\r
- }\r
- return false;\r
- }\r
- \r
- @Override\r
- public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
- \r
- }\r
- \r
- @Override\r
- public void dispose() {\r
- \r
- }\r
- }\r
- \r
- private class JMEScenegraphLabelProvider extends LabelProvider {\r
- @Override\r
- public String getText(Object element) {\r
- if (element == null)\r
- return null;\r
- if (element instanceof JMEAdaptable)\r
- element = ((JMEAdaptable)element).getElement();\r
- SceneElement e = (SceneElement)element;\r
- return e.getName() + " : " + e.getClass();\r
- }\r
- \r
- @Override\r
- public Image getImage(Object element) {\r
- if (element == null)\r
- return null;\r
- if (element instanceof JMEAdaptable)\r
- element = ((JMEAdaptable)element).getElement();\r
- ImageDescriptor desc = null;\r
- if (element instanceof GeomBatch)\r
- desc = BATCH_IMAGE;\r
- else if (element instanceof Geometry)\r
- desc = GEOMETRY_IMAGE;\r
- else if (element instanceof Node)\r
- desc = NODE_IMAGE;\r
- else \r
- return null;\r
- return ImageCache.getInstance().getImage(desc);\r
- }\r
- }\r
- \r
- private class GNScenegraphContentProvider implements ITreeContentProvider {\r
- @Override\r
- public Object[] getChildren(Object parentElement) {\r
- if (parentElement instanceof GNAdaptable)\r
- parentElement = ((GNAdaptable)parentElement).getNode();\r
- IGraphicsNode node = (IGraphicsNode)parentElement;\r
- Object children[] = new Object[node.getChildren().size()];\r
- Iterator<IGraphicsNode> it = node.getChildren().iterator();\r
- for (int i = 0; i < node.getChildren().size(); i++) {\r
- children[i] = new GNAdaptable(it.next());\r
- }\r
- return children;\r
- }\r
- \r
- @Override\r
- public Object[] getElements(Object inputElement) {\r
- if (inputElement instanceof ThreeDimensionalEditorBase) {\r
- IGraphicsNode root = ((ThreeDimensionalEditorBase)inputElement).getScenegraphAdapter().getRootNode();\r
- if (root != null)\r
- return new Object[]{new GNAdaptable(root)};\r
- }\r
- return new Object[0];\r
- }\r
- \r
- @Override\r
- public Object getParent(Object element) {\r
- if (element instanceof GNAdaptable)\r
- element = ((GNAdaptable)element).getNode();\r
- IGraphicsNode node = (IGraphicsNode)element;\r
- return node.getParent();\r
- }\r
- \r
- @Override\r
- public boolean hasChildren(Object element) {\r
- if (element instanceof GNAdaptable)\r
- element = ((GNAdaptable)element).getNode();\r
- IGraphicsNode node = (IGraphicsNode)element;\r
- return node.getChildren().size() > 0;\r
- }\r
- \r
- @Override\r
- public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
- \r
- }\r
- \r
- @Override\r
- public void dispose() {\r
- \r
- }\r
- }\r
- \r
- private class GNScenegraphLabelProvider extends LabelProvider {\r
- @Override\r
- public String getText(Object element) {\r
- if (element instanceof GNAdaptable)\r
- element = ((GNAdaptable)element).getNode();\r
- IGraphicsNode node = (IGraphicsNode)element;\r
- return node.getGroup().getName() + " : " + node.getClass();\r
- }\r
- \r
- @Override\r
- public Image getImage(Object element) {\r
- ImageDescriptor desc = NODE_IMAGE;\r
-// if (element instanceof GeomBatch)\r
-// desc = BATCH_IMAGE;\r
-// else if (element instanceof Geometry)\r
-// desc = GEOMETRY_IMAGE;\r
-// else if (element instanceof Node)\r
-// desc = NODE_IMAGE;\r
-// else \r
-// return null;\r
- return ImageCache.getInstance().getImage(desc);\r
- }\r
- }\r
- \r
- private class JMEAdaptable implements IAdaptable {\r
- SceneElement element;\r
- \r
- public JMEAdaptable(SceneElement element) {\r
- assert (element != null);\r
- this.element = element;\r
- }\r
- \r
- @SuppressWarnings("unchecked")\r
- @Override\r
- public Object getAdapter(Class adapter) {\r
- if (adapter == IPropertySource.class) {\r
- return new JMEProperties(element);\r
- }\r
- return null;\r
- }\r
- \r
- public SceneElement getElement() {\r
- return element;\r
- }\r
- }\r
- \r
- private class GNAdaptable implements IAdaptable {\r
- IGraphicsNode node;\r
- \r
- public GNAdaptable(IGraphicsNode node) {\r
- assert (node != null);\r
- this.node = node;\r
- }\r
- \r
- @SuppressWarnings("unchecked")\r
- @Override\r
- public Object getAdapter(Class adapter) {\r
- if (adapter == IPropertySource.class) {\r
- return new GNProperties(node);\r
- }\r
- return null;\r
- }\r
- \r
- public IGraphicsNode getNode() {\r
- return node;\r
- }\r
- }\r
- \r
- private static final String NAME = "name";\r
- private static final String CULL_MODE = "cullmode";\r
- private static final String CULL_MODES[] = {"Inherit","Dynamic","Always","Never"};\r
- private static final String LIGHT_MODE = "lightmode";\r
- private static final String LIGHT_MODES[] = {"Off","Combine First","Combine Closest","Combine Recent Enabled","Inherit","Replace"};\r
- private static final String LOCAL_CULL_MODE = "localcullmode";\r
- private static final String LOCAL_LIGHT_MODE = "locallightmode";\r
- private static final String LOCAL_NORMALS_MODE = "localnormalsmode";\r
- private static final String LOCAL_RENDER_QUEUE_MODE ="localrenderqueuemode";\r
- private static final String LOCAL_TEXTURE_COMBINE_MODE = "localtexturecombinemode";\r
- private static final String LOCKS = "locks";\r
- private static final String NORMALS_MODE = "normalsmode";\r
- private static final String NORMALS_MODES[] = {"Inherit","Use Provided","Normalize Provided","Normalize if scaled","Off"};\r
- private static final String RENDER_QUEUE_MODE = "renderqueuemode";\r
- private static final String RENDER_QUEUE_MODES[] = {"Inherit","Skip","Opaque","Transparent","Ortho"};\r
- private static final String TEXTURE_COMBINE_MODE = "texturecombinemode";\r
- private static final String TEXTURE_COMBINE_MODES[] = {"Off","First","Closest","Recent enabled","Inherit","Replace"};\r
- \r
- private static final String BOOLEAN_VALUES[] = {"False","True"};\r
- \r
- private class JMEProperties implements IPropertySource { \r
- \r
- SceneElement element;\r
- \r
- public JMEProperties(SceneElement element) {\r
- this.element = element;\r
- }\r
- \r
- @Override\r
- public Object getEditableValue() {\r
- return this;\r
- }\r
- \r
- @Override\r
- public IPropertyDescriptor[] getPropertyDescriptors() {\r
- List<IPropertyDescriptor> desc = new ArrayList<IPropertyDescriptor>();\r
- desc.add(new TextPropertyDescriptor(NAME,"Name"));\r
- desc.add(new ComboBoxPropertyDescriptor(CULL_MODE,"Cull Mode",CULL_MODES));\r
- desc.add(new ComboBoxPropertyDescriptor(LIGHT_MODE,"Light Combine Mode",LIGHT_MODES));\r
- desc.add(new ComboBoxPropertyDescriptor(LOCAL_CULL_MODE,"Local Cull Mode",CULL_MODES));\r
- desc.add(new ComboBoxPropertyDescriptor(LOCAL_LIGHT_MODE,"Local Light Combine Mode",LIGHT_MODES));\r
- desc.add(new ComboBoxPropertyDescriptor(LOCAL_NORMALS_MODE,"Local Normals Mode",NORMALS_MODES));\r
- desc.add(new ComboBoxPropertyDescriptor(LOCAL_RENDER_QUEUE_MODE,"Local Render Queue Mode",RENDER_QUEUE_MODES));\r
- desc.add(new ComboBoxPropertyDescriptor(LOCAL_TEXTURE_COMBINE_MODE,"Local Texture Combine Mode",TEXTURE_COMBINE_MODES));\r
- desc.add(new TextPropertyDescriptor(LOCKS,"Locks"));\r
- desc.add(new ComboBoxPropertyDescriptor(NORMALS_MODE,"Normals Mode",NORMALS_MODES));\r
- desc.add(new ComboBoxPropertyDescriptor(RENDER_QUEUE_MODE,"Render Queue Mode",RENDER_QUEUE_MODES));\r
- desc.add(new ComboBoxPropertyDescriptor(TEXTURE_COMBINE_MODE,"Texture Combine Mode",TEXTURE_COMBINE_MODES));\r
- return desc.toArray(new IPropertyDescriptor[desc.size()]);\r
-\r
- }\r
- \r
- @Override\r
- public Object getPropertyValue(Object id) {\r
- if (id == NAME) {\r
- return element.getName();\r
- } else if (id == CULL_MODE) {\r
- return element.getCullMode();\r
- } else if (id == LIGHT_MODE) {\r
- return element.getLightCombineMode();\r
- } else if (id == LOCAL_CULL_MODE) {\r
- return element.getLocalCullMode();\r
- } else if (id == LOCAL_LIGHT_MODE) {\r
- return element.getLocalLightCombineMode();\r
- } else if (id == LOCAL_NORMALS_MODE) {\r
- return element.getLocalNormalsMode();\r
- } else if (id == LOCAL_RENDER_QUEUE_MODE) {\r
- return element.getLocalRenderQueueMode();\r
- } else if (id == LOCAL_TEXTURE_COMBINE_MODE) {\r
- return element.getLocalTextureCombineMode();\r
- } else if (id == LOCKS) {\r
- return element.getLocks();\r
- } else if (id == NORMALS_MODE) {\r
- return element.getNormalsMode();\r
- } else if (id == RENDER_QUEUE_MODE) {\r
- return element.getRenderQueueMode();\r
- } else if (id == TEXTURE_COMBINE_MODE) {\r
- return element.getTextureCombineMode();\r
- }\r
- \r
-// element.getZOrder();\r
-// element.isCollidable();\r
-\r
- return null;\r
- }\r
- \r
- @Override\r
- public boolean isPropertySet(Object id) {\r
- return false;\r
- }\r
- \r
- @Override\r
- public void resetPropertyValue(Object id) {\r
- \r
- }\r
- \r
- @Override\r
- public void setPropertyValue(Object id, Object value) {\r
- if (id == NAME) {\r
- element.setName((String)value);\r
- } else if (id == CULL_MODE) {\r
- element.setCullMode((Integer)value);\r
- } else if (id == LIGHT_MODE) {\r
- element.setLightCombineMode((Integer)value);\r
- } else if (id == LOCAL_CULL_MODE) {\r
- \r
- } else if (id == LOCAL_LIGHT_MODE) {\r
- \r
- } else if (id == LOCAL_NORMALS_MODE) {\r
- \r
- } else if (id == LOCAL_RENDER_QUEUE_MODE) {\r
- \r
- } else if (id == LOCAL_TEXTURE_COMBINE_MODE) {\r
- \r
- } else if (id == LOCKS) {\r
- element.setLocks((Integer)value);\r
- } else if (id == NORMALS_MODE) {\r
- element.setNormalsMode((Integer)value);\r
- } else if (id == RENDER_QUEUE_MODE) {\r
- element.setRenderQueueMode((Integer)value);\r
- } else if (id == TEXTURE_COMBINE_MODE) {\r
- element.setTextureCombineMode((Integer)value);\r
- }\r
- \r
- }\r
-\r
- }\r
- \r
- private static final String SELECTED = "selected";\r
- private static final String HIGHLIGHTED = "highlighted";\r
- private static final String VISIBLE = "visible";\r
- \r
- private class GNProperties implements IPropertySource {\r
- IGraphicsNode node;\r
- \r
- public GNProperties(IGraphicsNode node) {\r
- this.node = node;\r
- }\r
- \r
- \r
- @Override\r
- public Object getEditableValue() {\r
- return this;\r
- }\r
- \r
- @Override\r
- public IPropertyDescriptor[] getPropertyDescriptors() {\r
- List<IPropertyDescriptor> desc = new ArrayList<IPropertyDescriptor>();\r
- if (node instanceof ISelectableNode) {\r
- //ISelectableNode n = (ISelectableNode)node;\r
- \r
- desc.add(new ComboBoxPropertyDescriptor(SELECTED,"Selected",BOOLEAN_VALUES));\r
- desc.add(new ComboBoxPropertyDescriptor(HIGHLIGHTED,"Highlighted",BOOLEAN_VALUES));\r
- desc.add(new ComboBoxPropertyDescriptor(VISIBLE,"Visible",BOOLEAN_VALUES));\r
- \r
- }\r
- return desc.toArray(new IPropertyDescriptor[desc.size()]);\r
- }\r
- \r
- @Override\r
- public Object getPropertyValue(Object id) {\r
- if (node instanceof ISelectableNode) {\r
- ISelectableNode n = (ISelectableNode)node;\r
- if (id == SELECTED) {\r
- if (n.isSelected())\r
- return 1;\r
- return 0;\r
- } else if (id == HIGHLIGHTED) {\r
- if (n.isHighlighted())\r
- return 1;\r
- return 0;\r
- } else if (id == VISIBLE) {\r
- if (n.isVisible())\r
- return 1;\r
- return 0;\r
- }\r
- }\r
- if (node instanceof IGeometryNode) {\r
- //IGeometryNode n = (IGeometryNode)node;\r
- }\r
-\r
- return null;\r
- }\r
- \r
- @Override\r
- public boolean isPropertySet(Object id) {\r
- return false;\r
- }\r
- \r
- @Override\r
- public void resetPropertyValue(Object id) {\r
-\r
- }\r
- \r
- @Override\r
- public void setPropertyValue(Object id, Object value) {\r
- if (node instanceof ISelectableNode) {\r
- ISelectableNode n = (ISelectableNode)node;\r
- boolean b = ((Integer)value) == 1;\r
- if (id == SELECTED) {\r
- n.setSelected(b);\r
- } else if (id == HIGHLIGHTED) {\r
- n.setHighlighted(b);\r
- } else if (id == VISIBLE) {\r
- n.setVisible(b);\r
- }\r
- }\r
- \r
- }\r
-\r
- \r
- }\r
- \r
-}\r
- \r
-\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.views;\r
-\r
-import org.eclipse.jface.viewers.ISelection;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.layout.GridLayout;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Display;\r
-import org.eclipse.ui.IPartListener;\r
-import org.eclipse.ui.IWorkbenchPart;\r
-import org.eclipse.ui.forms.events.ExpansionAdapter;\r
-import org.eclipse.ui.forms.events.ExpansionEvent;\r
-import org.eclipse.ui.forms.widgets.FormToolkit;\r
-import org.eclipse.ui.forms.widgets.ScrolledForm;\r
-import org.eclipse.ui.forms.widgets.Section;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Session;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-import org.simantics.proconf.ui.workbench.ResourceEditorPart;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-import org.simantics.utils.ui.ISelectionUtils;\r
-import org.simantics.utils.ui.jface.BaseSelectionProvider;\r
-\r
-\r
-\r
-public abstract class SinglePageResourceEditor extends ResourceEditorPart {\r
- private ScrolledForm form;\r
- private BaseSelectionProvider defaultInputSelectionProvider = new BaseSelectionProvider();\r
- protected FormToolkit toolkit;\r
- \r
- @Override\r
- public void createPartControl(Composite parent) {\r
- this.getEditorSite().getPage().addPartListener(new IPartListener() {\r
- \r
- boolean opened = false;\r
- boolean activated = false;\r
- \r
- public void partOpened(IWorkbenchPart part) {\r
- if (part.equals(SinglePageResourceEditor.this.getEditorSite().getPart())) {\r
- opened = true;\r
- }\r
- }\r
- \r
- public void partActivated(IWorkbenchPart part) {\r
- if (part.equals(SinglePageResourceEditor.this.getEditorSite().getPart())) {\r
- if (opened & !activated) {\r
- activated = true;\r
- load();\r
- }\r
- }\r
- }\r
- \r
- public void partBroughtToTop(IWorkbenchPart part) {}\r
- \r
- public void partClosed(IWorkbenchPart part) {}\r
- \r
- public void partDeactivated(IWorkbenchPart part) {}\r
- \r
- private void load() {\r
- Session ses = SinglePageResourceEditor.this.getSession();\r
- GraphRequestAdapter r = new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g)\r
- throws Exception {\r
- reload(g);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- };\r
- ses.asyncRead(r);\r
- }\r
- });\r
- try {\r
- toolkit = new FormToolkit(parent.getDisplay());\r
- form = getToolkit().createScrolledForm(parent);\r
-\r
- GridLayout layout = new GridLayout(2, false);\r
- form.getBody().setLayout(layout);\r
- form.getBody().setLayoutData(\r
- new GridData(GridData.FILL, GridData.FILL, true, true));\r
-\r
- // By default make this ViewPart use a default ISelectionProvider\r
- // that will offer the viewparts input resource as its selection.\r
- // The Resource is wrapped into a ResourceSelection object.\r
- // Any widgets created in createWidgets may override the default\r
- // selection provider.\r
- getEditorSite().setSelectionProvider(defaultInputSelectionProvider);\r
-\r
- beforeCreateWidgets();\r
- createWidgets();\r
-\r
- //reload();\r
-\r
- form.setText(getFormText());\r
-\r
- // Finally Set the default selection which will have an effect only\r
- // if nothing in createWidgets has overridden the default selection\r
- // provider.\r
- ISelection s = ISelectionUtils\r
- .createSelection(new StructuredResourceSelection(\r
- getInputResource()));\r
- defaultInputSelectionProvider.setSelection(s);\r
-\r
- } catch (Exception e) {\r
- Display d = getSite().getShell().getDisplay();\r
- d.asyncExec(new Runnable() {\r
- public void run() {\r
- getSite().getPage().closeEditor(\r
- SinglePageResourceEditor.this, false);\r
- }\r
- });\r
-\r
- ErrorLogger.defaultLogError("Single-page type editor failed to open, see exception for details",e);\r
- }\r
- }\r
-\r
- public ScrolledForm getActiveForm() {\r
- return form;\r
- }\r
-\r
- protected Composite getBody() {\r
- return form.getBody();\r
- }\r
-\r
- public Composite newGridSection(int formColumns, int childColumns,\r
- boolean equalWidth, boolean grabVertical, String text,\r
- String description) {\r
- return newGridSection(getBody(), formColumns, childColumns, equalWidth,\r
- grabVertical, text, description);\r
- }\r
-\r
- public Composite newGridSection(Composite parent, int formColumns,\r
- int childColumns, boolean equalWidth, boolean grabVertical,\r
- String text, String description) {\r
- FormToolkit toolkit = getToolkit();\r
-\r
- Section section = toolkit.createSection(parent, Section.DESCRIPTION\r
- | Section.TWISTIE | Section.TITLE_BAR | Section.EXPANDED);\r
- section.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true,\r
- grabVertical, formColumns, 1));\r
- section.addExpansionListener(new ExpansionAdapter() {\r
- public void expansionStateChanged(ExpansionEvent e) {\r
- //System.out.println("SinglePageTypeEditor: expansionStateChanged " + e);\r
- //reflow(true);\r
- }\r
- });\r
- section.setText(text);\r
- section.setDescription(description);\r
- Composite sectionClient = toolkit.createComposite(section);\r
- sectionClient.setLayout(new GridLayout(childColumns, equalWidth));\r
- sectionClient.setLayoutData(new GridData());\r
- section.setClient(sectionClient);\r
- return sectionClient;\r
- }\r
-\r
- \r
-\r
- //----------------------------------------------------------------------\r
- // Getters\r
-\r
- public FormToolkit getToolkit() {\r
- return toolkit;\r
- }\r
-\r
- //----------------------------------------------------------------------\r
- // Event utilities\r
-\r
- public void reflow(boolean flushCache) {\r
- //System.out.println("FormTypeEditorBase.reflow(" + flushCache + ")");\r
- getActiveForm().reflow(flushCache);\r
- }\r
-\r
- @Override\r
- public void dispose() {\r
- if (toolkit != null) {\r
- toolkit.dispose();\r
- }\r
- super.dispose();\r
- }\r
-\r
- @Override\r
- public void setFocus() {\r
- //System.out.println("FormTypeEditorBase.setFocus(): Input = " + getInput());\r
- ScrolledForm form = getActiveForm();\r
- if (form != null) {\r
- form.setFocus();\r
- }\r
- }\r
-\r
- protected abstract String getFormText();\r
-\r
- /**\r
- * Returns null by default which makes {@link #updateTitle()} not set the\r
- * part name programmatically, i.e. the plugin-defined view name will stay.\r
- * \r
- * @return\r
- */\r
- protected String getTitleText() {\r
- return null;\r
- }\r
-\r
- /**\r
- * Return null by default which makes {@link #updateTitle()} clear the\r
- * tooltip.\r
- * \r
- * @return\r
- */\r
- protected String getTitleTooltip() {\r
- return null;\r
- }\r
-\r
- /**\r
- * A method for performing initializations just before UI initialization.\r
- */\r
- protected void beforeCreateWidgets() {\r
- }\r
-\r
- /**\r
- * A method for initializing the UI of the view.\r
- */\r
- protected void createWidgets() {\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.proconf.g3d.views;\r
-\r
-import org.eclipse.jface.viewers.ISelection;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.layout.GridLayout;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.ui.ISelectionListener;\r
-import org.eclipse.ui.IWorkbenchPart;\r
-import org.eclipse.ui.forms.events.ExpansionAdapter;\r
-import org.eclipse.ui.forms.events.ExpansionEvent;\r
-import org.eclipse.ui.forms.widgets.FormToolkit;\r
-import org.eclipse.ui.forms.widgets.ScrolledForm;\r
-import org.eclipse.ui.forms.widgets.Section;\r
-import org.simantics.proconf.ui.workbench.GraphAccessViewPart;\r
-import org.simantics.utils.ui.jface.BaseSelectionProvider;\r
-\r
-public abstract class SinglePageResourceView extends GraphAccessViewPart{\r
- protected Composite parent;\r
- private ScrolledForm form;\r
- private BaseSelectionProvider defaultInputSelectionProvider = new BaseSelectionProvider();\r
- protected FormToolkit toolkit;\r
- protected ISelectionListener pageSelectionListener;\r
- \r
- @Override\r
- public void createPartControl(Composite parent) {\r
- super.createPartControl(parent);\r
- this.parent = parent;\r
-\r
- toolkit = new FormToolkit(parent.getDisplay());\r
- form = getToolkit().createScrolledForm(parent);\r
-\r
- GridLayout layout = new GridLayout(2, false);\r
- form.getBody().setLayout(layout);\r
- form.getBody().setLayoutData(\r
- new GridData(GridData.FILL, GridData.FILL, true, true));\r
-\r
- getViewSite().setSelectionProvider(defaultInputSelectionProvider);\r
-\r
- // createWidgets();\r
-\r
- form.setText(getFormText());\r
-\r
- hookPageSelection();\r
-\r
- }\r
- \r
- \r
- /**\r
- * Receives selection changes\r
- * \r
- * @param part\r
- * @param selection\r
- */\r
- protected void pageSelectionChanged(IWorkbenchPart part, ISelection selection) {\r
- \r
- }\r
- \r
- \r
- \r
- \r
- \r
- protected abstract String getFormText();\r
- \r
- protected abstract void createWidgets();\r
- \r
- @Override\r
- public void setFocus() {\r
- //System.out.println("FormTypeEditorBase.setFocus(): Input = " + getInput());\r
- ScrolledForm form = getActiveForm();\r
- if (form != null) {\r
- form.setFocus();\r
- }\r
- }\r
- \r
- public FormToolkit getToolkit() {\r
- return toolkit;\r
- }\r
- \r
- public ScrolledForm getActiveForm() {\r
- return form;\r
- }\r
- \r
- public void clearForm() {\r
- for (Control c : form.getBody().getChildren())\r
- c.dispose();\r
- \r
- }\r
- \r
- protected Composite getBody() {\r
- return form.getBody();\r
- }\r
- \r
- public Composite newGridSection(\r
- int formColumns,\r
- int childColumns,\r
- boolean equalWidth,\r
- boolean grabVertical,\r
- String text,\r
- String description) \r
- {\r
- return newGridSection(getBody(), formColumns, childColumns, equalWidth, grabVertical, text, description);\r
- }\r
-\r
- public Composite newGridSection(\r
- Composite parent,\r
- int formColumns,\r
- int childColumns,\r
- boolean equalWidth,\r
- boolean grabVertical,\r
- String text,\r
- String description)\r
- {\r
- FormToolkit toolkit = getToolkit();\r
- \r
- Section section = toolkit.createSection(parent,\r
- Section.DESCRIPTION | Section.TWISTIE | Section.TITLE_BAR | Section.EXPANDED);\r
- section.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, grabVertical, formColumns, 1));\r
- section.addExpansionListener(new ExpansionAdapter() {\r
- public void expansionStateChanged(ExpansionEvent e) {\r
- //System.out.println("SinglePageTypeEditor: expansionStateChanged " + e);\r
- //reflow(true);\r
- }\r
- });\r
- section.setText(text);\r
- section.setDescription(description);\r
- Composite sectionClient = toolkit.createComposite(section);\r
- sectionClient.setLayout(new GridLayout(childColumns, equalWidth));\r
- sectionClient.setLayoutData(new GridData());\r
- section.setClient(sectionClient);\r
- return sectionClient;\r
- }\r
- \r
- public void dispose() {\r
- if (pageSelectionListener != null)\r
- getSite().getPage().removePostSelectionListener(pageSelectionListener);\r
- \r
- super.dispose();\r
- }\r
- \r
- private void hookPageSelection() {\r
- pageSelectionListener = new ISelectionListener() {\r
- public void selectionChanged(IWorkbenchPart part, ISelection selection) {\r
- if (part == SinglePageResourceView.this)\r
- return;\r
- pageSelectionChanged(part, selection);\r
- }\r
- };\r
- getSite().getPage().addPostSelectionListener(pageSelectionListener);\r
- ISelection sel = getSite().getPage().getSelection();\r
- IWorkbenchPart wb = getSite().getPage().getActivePart();\r
- pageSelectionChanged(wb, sel);\r
- }\r
- \r
-}\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<classpath>\r
- <classpathentry kind="src" path="src"/>\r
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>\r
- <classpathentry kind="output" path="bin"/>\r
-</classpath>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<projectDescription>\r
- <name>org.simantics.processeditor</name>\r
- <comment></comment>\r
- <projects>\r
- </projects>\r
- <buildSpec>\r
- <buildCommand>\r
- <name>org.eclipse.jdt.core.javabuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- <buildCommand>\r
- <name>org.eclipse.pde.ManifestBuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- <buildCommand>\r
- <name>org.eclipse.pde.SchemaBuilder</name>\r
- <arguments>\r
- </arguments>\r
- </buildCommand>\r
- </buildSpec>\r
- <natures>\r
- <nature>org.eclipse.pde.PluginNature</nature>\r
- <nature>org.eclipse.jdt.core.javanature</nature>\r
- </natures>\r
-</projectDescription>\r
+++ /dev/null
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Processeditor Plug-in
-Bundle-SymbolicName: org.simantics.processeditor;singleton:=true
-Bundle-Version: 0.0.1.qualifier
-Bundle-Activator: org.simantics.processeditor.Activator
-Bundle-Vendor: VTT Technical Research Center of Finland
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- com.jme.eclipse,
- org.simantics.proconf.ui,
- org.simantics.proconf.g3d,
- org.simantics.proconf.image,
- org.simantics.layer0.stubs,
- org.simantics.layer0.utils,
- org.simantics.utils,
- org.simantics.utils.datastructures,
- javax.vecmath,
- org.simantics.proconf.ode,
- org.simantics.proconf.browsing,
- org.simantics.utils.ui,
- org.simantics.utils.ui.workbench,
- org.simantics.proconf.g3d.shapeeditor,
- org.eclipse.ui.views,
- org.simantics.animation
-Eclipse-LazyStart: true
-Export-Package: org.simantics.processeditor.adapters,
- org.simantics.processeditor.common,
- org.simantics.processeditor.stubs,
- org.simantics.processeditor.tools
+++ /dev/null
-source.. = src/\r
-output.. = bin/\r
-bin.includes = META-INF/,\\r
- .,\\r
- plugin.xml\r
+++ /dev/null
-# Blender3D MTL File: dcp.blend\r
-# Material Count: 0\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="100"
- height="100"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44+devel"
- version="1.0"
- sodipodi:docname="Component.svg"
- inkscape:output_extension="org.inkscape.output.svg.inkscape"
- sodipodi:docbase="C:\Documents and Settings\Make\Desktop"
- inkscape:export-filename="C:\Documents and Settings\Make\Desktop\Component.png"
- inkscape:export-xdpi="14.4"
- inkscape:export-ydpi="14.4"
- sodipodi:modified="true">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient3133">
- <stop
- style="stop-color:#4c4c4c;stop-opacity:1;"
- offset="0"
- id="stop3135" />
- <stop
- id="stop3141"
- offset="0.5"
- style="stop-color:#cbcbcb;stop-opacity:1;" />
- <stop
- style="stop-color:#4c4c4c;stop-opacity:1;"
- offset="1"
- id="stop3137" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3133"
- id="linearGradient5083"
- x1="45.114037"
- y1="48.248638"
- x2="45.114037"
- y2="82.201416"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3133"
- id="linearGradient3152"
- x1="21.809525"
- y1="10.776942"
- x2="74.932327"
- y2="10.776942"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3133"
- id="linearGradient4129"
- x1="34.842106"
- y1="25.93985"
- x2="62.776943"
- y2="25.93985"
- gradientUnits="userSpaceOnUse" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="7.98"
- inkscape:cx="50"
- inkscape:cy="65.037594"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- width="100px"
- height="100px"
- inkscape:window-width="1680"
- inkscape:window-height="994"
- inkscape:window-x="1276"
- inkscape:window-y="-4" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <rect
- style="fill:url(#linearGradient5083);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect2160"
- width="77.318306"
- height="29.949863"
- x="11.403508"
- y="50.250629" />
- <rect
- style="fill:url(#linearGradient4129);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect2171"
- width="23.934837"
- height="17.167919"
- x="36.842106"
- y="32.957397" />
- <rect
- style="fill:url(#linearGradient3152);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect2173"
- width="49.122807"
- height="13.283208"
- x="23.809525"
- y="19.674185" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="100"
- height="100"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44+devel"
- version="1.0"
- sodipodi:docbase="C:\Documents and Settings\Make\Desktop"
- sodipodi:docname="Elbow.svg"
- inkscape:output_extension="org.inkscape.output.svg.inkscape"
- inkscape:export-filename="C:\Documents and Settings\Make\Desktop\Elbow.png"
- inkscape:export-xdpi="14.4"
- inkscape:export-ydpi="14.4"
- sodipodi:modified="true">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient8030">
- <stop
- id="stop8032"
- offset="0"
- style="stop-color:#6c6c6c;stop-opacity:1;" />
- <stop
- style="stop-color:#4c4c4c;stop-opacity:1;"
- offset="0.25"
- id="stop8038" />
- <stop
- style="stop-color:#c8c8c8;stop-opacity:1;"
- offset="0.5"
- id="stop8034" />
- <stop
- id="stop8040"
- offset="0.75"
- style="stop-color:#4c4c4c;stop-opacity:1;" />
- <stop
- id="stop8036"
- offset="1"
- style="stop-color:#6c6c6c;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient3133">
- <stop
- style="stop-color:#6c6c6c;stop-opacity:1;"
- offset="0"
- id="stop3135" />
- <stop
- id="stop3141"
- offset="0.5"
- style="stop-color:#ffffff;stop-opacity:1;" />
- <stop
- style="stop-color:#6c6c6c;stop-opacity:1;"
- offset="1"
- id="stop3137" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3133"
- id="linearGradient5083"
- x1="45.114037"
- y1="34.211781"
- x2="45.236843"
- y2="63.532585"
- gradientUnits="userSpaceOnUse" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8030"
- id="radialGradient6090"
- cx="96.962318"
- cy="96.001694"
- fx="96.962318"
- fy="96.001694"
- r="50.5"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(2.2964837,5.7024121e-8,-5.8341962e-8,2.3753605,-132.4242,-138.9854)" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="6.0477091"
- inkscape:cx="115.16906"
- inkscape:cy="57.595569"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- width="100px"
- height="100px"
- inkscape:window-width="1680"
- inkscape:window-height="994"
- inkscape:window-x="1280"
- inkscape:window-y="22" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <path
- style="fill:url(#radialGradient6090);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:none"
- d="M 89.854773,9.8471149 C 46.494023,9.8471149 11.30269,45.155211 11.30269,88.65983 L 50.578732,88.65983 C 50.577409,88.527292 50.578732,88.398616 50.578732,88.265766 C 50.578732,66.73098 67.998442,49.253473 89.462013,49.253473 C 89.594423,49.253473 89.722674,49.252145 89.854773,49.253473 L 89.854773,9.8471149 z "
- id="path5107" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="100"
- height="100"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- version="1.0"
- sodipodi:docname="Nozzle.svg"
- sodipodi:docbase="D:\dev\icons"
- inkscape:export-filename="C:\Documents and Settings\Make\Desktop\Straight.png"
- inkscape:export-xdpi="14.4"
- inkscape:export-ydpi="14.4">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient3133">
- <stop
- style="stop-color:#4c4c4c;stop-opacity:1;"
- offset="0"
- id="stop3135" />
- <stop
- id="stop3141"
- offset="0.5"
- style="stop-color:#cbcbcb;stop-opacity:1;" />
- <stop
- style="stop-color:#4c4c4c;stop-opacity:1;"
- offset="1"
- id="stop3137" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3133"
- id="linearGradient5083"
- x1="45.114037"
- y1="32.711548"
- x2="45.114037"
- y2="66.681152"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3133"
- id="linearGradient2772"
- x1="81.077698"
- y1="12.912281"
- x2="81.077698"
- y2="84.456146"
- gradientUnits="userSpaceOnUse" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="7.98"
- inkscape:cx="50"
- inkscape:cy="50"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- width="100px"
- height="100px"
- inkscape:window-width="1280"
- inkscape:window-height="968"
- inkscape:window-x="-4"
- inkscape:window-y="-4" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <rect
- style="fill:url(#linearGradient5083);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect2160"
- width="77.318306"
- height="29.949863"
- x="11.403508"
- y="34.711781" />
- <rect
- style="fill:url(#linearGradient2772);fill-opacity:1.0;stroke:black;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect1875"
- width="15.789474"
- height="67.543861"
- x="73.182961"
- y="14.912281" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="100"
- height="100"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44+devel"
- version="1.0"
- sodipodi:docname="Straight.svg"
- inkscape:output_extension="org.inkscape.output.svg.inkscape"
- sodipodi:docbase="C:\Documents and Settings\Make\Desktop"
- inkscape:export-filename="C:\Documents and Settings\Make\Desktop\Straight.png"
- inkscape:export-xdpi="14.4"
- inkscape:export-ydpi="14.4"
- sodipodi:modified="true">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient3133">
- <stop
- style="stop-color:#4c4c4c;stop-opacity:1;"
- offset="0"
- id="stop3135" />
- <stop
- id="stop3141"
- offset="0.5"
- style="stop-color:#cbcbcb;stop-opacity:1;" />
- <stop
- style="stop-color:#4c4c4c;stop-opacity:1;"
- offset="1"
- id="stop3137" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3133"
- id="linearGradient5083"
- x1="45.114037"
- y1="32.711548"
- x2="45.114037"
- y2="66.681152"
- gradientUnits="userSpaceOnUse" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="7.98"
- inkscape:cx="50"
- inkscape:cy="44.987469"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- width="100px"
- height="100px"
- inkscape:window-width="1680"
- inkscape:window-height="994"
- inkscape:window-x="1276"
- inkscape:window-y="-4" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <rect
- style="fill:url(#linearGradient5083);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect2160"
- width="77.318306"
- height="29.949863"
- x="11.403508"
- y="34.711781" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="32"
- height="32"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- version="1.0"
- inkscape:export-filename="C:\Documents and Settings\tuoxmao\Desktop\bubble.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:docbase="C:\Documents and Settings\tuoxmao\Desktop"
- sodipodi:docname="bubble.svg">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient3835">
- <stop
- style="stop-color:black;stop-opacity:1;"
- offset="0"
- id="stop3837" />
- <stop
- style="stop-color:black;stop-opacity:0;"
- offset="1"
- id="stop3839" />
- </linearGradient>
- <marker
- inkscape:stockid="Arrow1Lstart"
- orient="auto"
- refY="0.0"
- refX="0.0"
- id="Arrow1Lstart"
- style="overflow:visible">
- <path
- id="path3828"
- d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
- style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
- transform="scale(0.8) translate(12.5,0)" />
- </marker>
- <linearGradient
- id="linearGradient2762">
- <stop
- style="stop-color:white;stop-opacity:0;"
- offset="0"
- id="stop2764" />
- <stop
- id="stop5615"
- offset="0.25"
- style="stop-color:white;stop-opacity:0.20392157;" />
- <stop
- id="stop5613"
- offset="0.5"
- style="stop-color:white;stop-opacity:1;" />
- <stop
- style="stop-color:white;stop-opacity:1;"
- offset="1"
- id="stop2766" />
- </linearGradient>
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2762"
- id="radialGradient2768"
- cx="9.7167473"
- cy="9.0794983"
- fx="9.7167473"
- fy="9.0794983"
- r="16"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.470992,1.073004,-1.001683,1.373218,6.378253,-11.49047)" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="10"
- inkscape:cx="16"
- inkscape:cy="16"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- width="32px"
- height="32px"
- inkscape:window-width="1280"
- inkscape:window-height="968"
- inkscape:window-x="-4"
- inkscape:window-y="-4" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <path
- sodipodi:type="arc"
- style="fill:url(#radialGradient2768);fill-opacity:1;stroke:white;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker-start:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:10;stroke-opacity:1"
- id="path1874"
- sodipodi:cx="16"
- sodipodi:cy="16"
- sodipodi:rx="16"
- sodipodi:ry="16"
- d="M 32 16 A 16 16 0 1 1 0,16 A 16 16 0 1 1 32 16 z"
- transform="matrix(0.935294,0,0,0.935294,1.035294,1.035294)" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="32"
- height="32"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- version="1.0"
- inkscape:export-filename="C:\Documents and Settings\tuoxmao\Desktop\crosshair.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90"
- sodipodi:docbase="C:\Documents and Settings\tuoxmao\Desktop"
- sodipodi:docname="crosshair.svg">
- <defs
- id="defs4" />
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="10"
- inkscape:cx="16"
- inkscape:cy="16"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- width="32px"
- height="32px"
- inkscape:window-width="1280"
- inkscape:window-height="968"
- inkscape:window-x="-4"
- inkscape:window-y="-4" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <path
- sodipodi:type="arc"
- style="fill:none;fill-opacity:1;stroke:white;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:10;stroke-opacity:0.4973262"
- id="path1872"
- sodipodi:cx="16"
- sodipodi:cy="16"
- sodipodi:rx="12"
- sodipodi:ry="12"
- d="M 28 16 A 12 12 0 1 1 4,16 A 12 12 0 1 1 28 16 z" />
- <path
- style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:white;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.4973262;stroke-miterlimit:4;stroke-dasharray:none"
- d="M 16,7.1054274e-015 L 16,32"
- id="path2760" />
- <path
- style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:white;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.4973262;stroke-miterlimit:4;stroke-dasharray:none"
- d="M 0,16 L 32,16"
- id="path2762" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="100"
- height="100"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- inkscape:export-filename="D:\dev\icons\factory.png"
- inkscape:export-xdpi="14.4"
- inkscape:export-ydpi="14.4"
- sodipodi:docbase="D:\dev\icons"
- sodipodi:docname="factory.svg"
- version="1.0">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient10747">
- <stop
- style="stop-color:blue;stop-opacity:1;"
- offset="0"
- id="stop10749" />
- <stop
- style="stop-color:aqua;stop-opacity:1;"
- offset="1"
- id="stop10751" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10747"
- id="linearGradient10753"
- x1="20.142487"
- y1="1011.8181"
- x2="20.142487"
- y2="1019.4606"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10747"
- id="linearGradient11642"
- gradientUnits="userSpaceOnUse"
- x1="20.142487"
- y1="1011.8181"
- x2="20.142487"
- y2="1019.4606"
- gradientTransform="translate(11.59326,6.479275e-2)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10747"
- id="linearGradient11646"
- gradientUnits="userSpaceOnUse"
- x1="20.142487"
- y1="1011.8181"
- x2="20.142487"
- y2="1019.4606"
- gradientTransform="translate(23.6399,6.479232e-2)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10747"
- id="linearGradient12543"
- gradientUnits="userSpaceOnUse"
- x1="20.142487"
- y1="1011.8181"
- x2="20.142487"
- y2="1019.4606" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10747"
- id="linearGradient12545"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(11.59326,6.479275e-2)"
- x1="20.142487"
- y1="1011.8181"
- x2="20.142487"
- y2="1019.4606" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10747"
- id="linearGradient12547"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(23.6399,6.479232e-2)"
- x1="20.142487"
- y1="1011.8181"
- x2="20.142487"
- y2="1019.4606" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10747"
- id="linearGradient1943"
- gradientUnits="userSpaceOnUse"
- x1="20.142487"
- y1="1011.8181"
- x2="20.142487"
- y2="1019.4606" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10747"
- id="linearGradient1945"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(11.59326,6.479275e-2)"
- x1="20.142487"
- y1="1011.8181"
- x2="20.142487"
- y2="1019.4606" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient10747"
- id="linearGradient1947"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(23.6399,6.479232e-2)"
- x1="20.142487"
- y1="1011.8181"
- x2="20.142487"
- y2="1019.4606" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="7.72"
- inkscape:cx="50"
- inkscape:cy="53.887018"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- inkscape:window-width="1280"
- inkscape:window-height="968"
- inkscape:window-x="-4"
- inkscape:window-y="-4"
- width="100px"
- height="100px" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <g
- id="g1923"
- transform="translate(0,-952.3316)">
- <rect
- y="952.36218"
- x="0"
- height="100"
- width="100"
- id="rect1874"
- style="fill:#00fd00;fill-opacity:0;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <g
- id="g1905">
- <rect
- style="fill:#d30000;fill-opacity:1;stroke:black;stroke-width:0.99912792;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect2768"
- width="9.0682287"
- height="69.819527"
- x="9.9736586"
- y="974.77106" />
- <g
- id="g12537"
- transform="matrix(1.681297,0,0,1,1.435511,0.129534)">
- <rect
- ry="0"
- y="1005.8278"
- x="10.411273"
- height="38.664726"
- width="42.032604"
- id="rect2766"
- style="fill:#d30000;fill-opacity:1;stroke:black;stroke-width:0.93630695;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <rect
- y="1011.8181"
- x="15.803109"
- height="7.642487"
- width="8.6787567"
- id="rect9860"
- style="fill:url(#linearGradient1943);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.06417111" />
- <rect
- y="1011.8829"
- x="27.396372"
- height="7.642487"
- width="8.6787567"
- id="rect11640"
- style="fill:url(#linearGradient1945);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.06417111" />
- <rect
- y="1011.883"
- x="39.443005"
- height="7.642487"
- width="8.6787567"
- id="rect11644"
- style="fill:url(#linearGradient1947);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.06417111" />
- </g>
- <g
- id="g1894">
- <path
- transform="translate(-36.39896,5.829015)"
- d="M 74.222796 966.48132 A 7.2538862 5.8290157 0 1 1 59.715024,966.48132 A 7.2538862 5.8290157 0 1 1 74.222796 966.48132 z"
- sodipodi:ry="5.8290157"
- sodipodi:rx="7.2538862"
- sodipodi:cy="966.48132"
- sodipodi:cx="66.96891"
- id="path2770"
- style="fill:black;fill-opacity:0.28877007;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- sodipodi:type="arc" />
- <path
- transform="translate(-57.12436,-10.23316)"
- d="M 85.621764 974.12384 A 7.5129533 8.4196892 0 1 1 70.595857,974.12384 A 7.5129533 8.4196892 0 1 1 85.621764 974.12384 z"
- sodipodi:ry="8.4196892"
- sodipodi:rx="7.5129533"
- sodipodi:cy="974.12384"
- sodipodi:cx="78.10881"
- id="path2772"
- style="fill:black;fill-opacity:0.44117647;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- sodipodi:type="arc" />
- <path
- transform="translate(-46.76166,-0.259068)"
- d="M 98.834197 969.13678 A 8.6139898 7.9663215 0 1 1 81.606217,969.13678 A 8.6139898 7.9663215 0 1 1 98.834197 969.13678 z"
- sodipodi:ry="7.9663215"
- sodipodi:rx="8.6139898"
- sodipodi:cy="969.13678"
- sodipodi:cx="90.220207"
- id="path2774"
- style="fill:black;fill-opacity:0.33422463;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.06417111"
- sodipodi:type="arc" />
- <path
- transform="matrix(0.932331,0,0,0.869919,-40.39746,117.1935)"
- d="M 98.834197 969.13678 A 8.6139898 7.9663215 0 1 1 81.606217,969.13678 A 8.6139898 7.9663215 0 1 1 98.834197 969.13678 z"
- sodipodi:ry="7.9663215"
- sodipodi:rx="8.6139898"
- sodipodi:cy="969.13678"
- sodipodi:cx="90.220207"
- id="path9856"
- style="fill:black;fill-opacity:0.33422463;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.06417111"
- sodipodi:type="arc" />
- <path
- transform="translate(-32.44819,-6.411903)"
- d="M 98.834197 969.13678 A 8.6139898 7.9663215 0 1 1 81.606217,969.13678 A 8.6139898 7.9663215 0 1 1 98.834197 969.13678 z"
- sodipodi:ry="7.9663215"
- sodipodi:rx="8.6139898"
- sodipodi:cy="969.13678"
- sodipodi:cx="90.220207"
- id="path9858"
- style="fill:black;fill-opacity:0.33422463;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.06417111"
- sodipodi:type="arc" />
- <path
- transform="translate(-47.21503,8.484471)"
- d="M 98.834197 969.13678 A 8.6139898 7.9663215 0 1 1 81.606217,969.13678 A 8.6139898 7.9663215 0 1 1 98.834197 969.13678 z"
- sodipodi:ry="7.9663215"
- sodipodi:rx="8.6139898"
- sodipodi:cy="969.13678"
- sodipodi:cx="90.220207"
- id="path12533"
- style="fill:black;fill-opacity:0.33422463;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.06417111"
- sodipodi:type="arc" />
- <path
- transform="matrix(0.691729,0,0,0.699187,-30.08931,285.3113)"
- d="M 98.834197 969.13678 A 8.6139898 7.9663215 0 1 1 81.606217,969.13678 A 8.6139898 7.9663215 0 1 1 98.834197 969.13678 z"
- sodipodi:ry="7.9663215"
- sodipodi:rx="8.6139898"
- sodipodi:cy="969.13678"
- sodipodi:cx="90.220207"
- id="path12535"
- style="fill:black;fill-opacity:0.33422463;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.06417111"
- sodipodi:type="arc" />
- <path
- transform="translate(-32.57772,4.59846)"
- d="M 98.834197 969.13678 A 8.6139898 7.9663215 0 1 1 81.606217,969.13678 A 8.6139898 7.9663215 0 1 1 98.834197 969.13678 z"
- sodipodi:ry="7.9663215"
- sodipodi:rx="8.6139898"
- sodipodi:cy="969.13678"
- sodipodi:cx="90.220207"
- id="path12549"
- style="fill:black;fill-opacity:0.33422463;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.06417111"
- sodipodi:type="arc" />
- <path
- transform="translate(-19.75388,-0.453354)"
- d="M 98.834197 969.13678 A 8.6139898 7.9663215 0 1 1 81.606217,969.13678 A 8.6139898 7.9663215 0 1 1 98.834197 969.13678 z"
- sodipodi:ry="7.9663215"
- sodipodi:rx="8.6139898"
- sodipodi:cy="969.13678"
- sodipodi:cx="90.220207"
- id="path12551"
- style="fill:black;fill-opacity:0.33422463;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.06417111"
- sodipodi:type="arc" />
- </g>
- </g>
- </g>
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="64px"
- height="64px"
- id="svg2157"
- sodipodi:version="0.32"
- inkscape:version="0.45+0.46pre2+devel"
- sodipodi:docbase="C:\Documents and Settings\Make\Desktop"
- sodipodi:docname="middle.svg"
- inkscape:output_extension="org.inkscape.output.svg.inkscape"
- inkscape:export-filename="D:\dev\icons\New Folder\middle.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <defs
- id="defs2159">
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="-50 : 600 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="700 : 600 : 1"
- inkscape:persp3d-origin="300 : 400 : 1"
- id="perspective31" />
- <linearGradient
- id="linearGradient3149">
- <stop
- id="stop3151"
- offset="0"
- style="stop-color:#c0c03f;stop-opacity:1;" />
- <stop
- id="stop3153"
- offset="1"
- style="stop-color:#c0a63f;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient7046">
- <stop
- style="stop-color:#ffff00;stop-opacity:1;"
- offset="0"
- id="stop7048" />
- <stop
- style="stop-color:#ffcd00;stop-opacity:1;"
- offset="1"
- id="stop7050" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient5088">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop5090" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop5092" />
- </linearGradient>
- <filter
- inkscape:collect="always"
- id="filter11994">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.375"
- id="feGaussianBlur11996" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter12983">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.915"
- id="feGaussianBlur12985" />
- </filter>
- <filter
- inkscape:collect="always"
- x="-0.14285714"
- width="1.2857143"
- y="-0.10344828"
- height="1.2068966"
- id="filter5187">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.25"
- id="feGaussianBlur5189" />
- </filter>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5088"
- id="linearGradient5094"
- x1="20.198912"
- y1="-9.0645924"
- x2="35.243752"
- y2="39.135406"
- gradientUnits="userSpaceOnUse" />
- <filter
- inkscape:collect="always"
- id="filter6073">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.62861738"
- id="feGaussianBlur6075" />
- </filter>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient7046"
- id="linearGradient7052"
- x1="32"
- y1="59.5"
- x2="32"
- y2="4.5"
- gradientUnits="userSpaceOnUse" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="1"
- inkscape:cx="32"
- inkscape:cy="28.07"
- inkscape:current-layer="layer1"
- showgrid="true"
- inkscape:document-units="px"
- inkscape:grid-bbox="true"
- inkscape:window-width="739"
- inkscape:window-height="573"
- inkscape:window-x="367"
- inkscape:window-y="140" />
- <metadata
- id="metadata2162">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- id="layer1"
- inkscape:label="Layer 1"
- inkscape:groupmode="layer">
- <path
- sodipodi:type="arc"
- style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter12983);fill-opacity:1"
- id="path2169"
- sodipodi:cx="32"
- sodipodi:cy="32"
- sodipodi:rx="30"
- sodipodi:ry="30"
- d="M 62 32 A 30 30 0 1 1 2,32 A 30 30 0 1 1 62 32 z" />
- <path
- sodipodi:type="arc"
- style="fill:url(#linearGradient7052);fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1.0;filter:url(#filter11994)"
- id="path2167"
- sodipodi:cx="32"
- sodipodi:cy="32"
- sodipodi:rx="27"
- sodipodi:ry="27"
- d="M 59 32 A 27 27 0 1 1 5,32 A 27 27 0 1 1 59 32 z" />
- <path
- style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1;filter:url(#filter5187)"
- d="M 32,32 L 47,17 L 53,23 L 44,32 L 53,41 L 47,47 L 32,32 z "
- id="path2168"
- sodipodi:nodetypes="ccccccc" />
- <use
- x="0"
- y="0"
- xlink:href="#path2168"
- id="use5195"
- transform="matrix(-1,0,0,-1,64,64)"
- width="64"
- height="64" />
- <path
- style="fill:url(#linearGradient5094);fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1.0;filter:url(#filter6073)"
- d="M 32 2 C 15.44 2 2 15.44 2 32 C 2 32.158352 1.9975512 32.310977 2 32.46875 C 8.1463048 32.486214 16.553215 32.403245 20.3125 31.8125 C 27.274155 30.718527 40.93099 29.497975 55.34375 13.15625 C 49.842663 6.3498757 41.426528 2 32 2 z "
- id="path2170" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="64px"
- height="64px"
- id="svg2157"
- sodipodi:version="0.32"
- inkscape:version="0.45+0.46pre2+devel"
- sodipodi:docbase="C:\Documents and Settings\Make\Desktop"
- sodipodi:docname="plus.svg"
- inkscape:output_extension="org.inkscape.output.svg.inkscape"
- inkscape:export-filename="D:\dev\icons\New Folder\plus.png"
- inkscape:export-xdpi="45"
- inkscape:export-ydpi="45">
- <defs
- id="defs2159">
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="-50 : 600 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="700 : 600 : 1"
- inkscape:persp3d-origin="300 : 400 : 1"
- id="perspective31" />
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="-50 : 600 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="700 : 600 : 1"
- inkscape:persp3d-origin="300 : 400 : 1"
- id="perspective30" />
- <linearGradient
- id="linearGradient3149">
- <stop
- id="stop3151"
- offset="0"
- style="stop-color:#c0c03f;stop-opacity:1;" />
- <stop
- id="stop3153"
- offset="1"
- style="stop-color:#c0a63f;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient7046">
- <stop
- style="stop-color:#ffff00;stop-opacity:1;"
- offset="0"
- id="stop7048" />
- <stop
- style="stop-color:#ffcd00;stop-opacity:1;"
- offset="1"
- id="stop7050" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient5088">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop5090" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop5092" />
- </linearGradient>
- <filter
- inkscape:collect="always"
- id="filter11994">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.375"
- id="feGaussianBlur11996" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter12983">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.915"
- id="feGaussianBlur12985" />
- </filter>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient5088"
- id="linearGradient5094"
- x1="20.198912"
- y1="-9.0645924"
- x2="35.243752"
- y2="39.135406"
- gradientUnits="userSpaceOnUse" />
- <filter
- inkscape:collect="always"
- id="filter6073">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.62861738"
- id="feGaussianBlur6075" />
- </filter>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient7046"
- id="linearGradient7052"
- x1="32"
- y1="59.5"
- x2="32"
- y2="4.5"
- gradientUnits="userSpaceOnUse" />
- <filter
- inkscape:collect="always"
- id="filter3153">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.0725"
- id="feGaussianBlur3155" />
- </filter>
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="5"
- inkscape:cx="32"
- inkscape:cy="32"
- inkscape:current-layer="layer1"
- showgrid="true"
- inkscape:document-units="px"
- inkscape:grid-bbox="true"
- inkscape:window-width="857"
- inkscape:window-height="644"
- inkscape:window-x="594"
- inkscape:window-y="111" />
- <metadata
- id="metadata2162">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- id="layer1"
- inkscape:label="Layer 1"
- inkscape:groupmode="layer">
- <path
- sodipodi:type="arc"
- style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter12983);fill-opacity:1"
- id="path2169"
- sodipodi:cx="32"
- sodipodi:cy="32"
- sodipodi:rx="30"
- sodipodi:ry="30"
- d="M 62 32 A 30 30 0 1 1 2,32 A 30 30 0 1 1 62 32 z" />
- <path
- sodipodi:type="arc"
- style="fill:url(#linearGradient7052);fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1.0;filter:url(#filter11994)"
- id="path2167"
- sodipodi:cx="32"
- sodipodi:cy="32"
- sodipodi:rx="27"
- sodipodi:ry="27"
- d="M 59 32 A 27 27 0 1 1 5,32 A 27 27 0 1 1 59 32 z" />
- <path
- style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1;filter:url(#filter3153);stroke-miterlimit:4;stroke-dasharray:none"
- d="M 15,34 L 15,30 L 30,30 L 30,15 L 34,15 L 34,30 L 49,30 L 49,34 L 34,34 L 34,49 L 30,49 L 30,34 L 15,34 z "
- id="path2178" />
- <path
- style="fill:url(#linearGradient5094);fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1.0;filter:url(#filter6073)"
- d="M 32 2 C 15.44 2 2 15.44 2 32 C 2 32.158352 1.9975512 32.310977 2 32.46875 C 8.1463048 32.486214 16.553215 32.403245 20.3125 31.8125 C 27.274155 30.718527 40.93099 29.497975 55.34375 13.15625 C 49.842663 6.3498757 41.426528 2 32 2 z "
- id="path2170" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="16"
- height="16"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.45+0.46pre2+devel"
- version="1.0"
- sodipodi:docname="tank.svg"
- inkscape:output_extension="org.inkscape.output.svg.inkscape"
- inkscape:export-filename="D:\dev\icons\tank.png"
- inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
- <defs
- id="defs4">
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="-50 : 600 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="700 : 600 : 1"
- inkscape:persp3d-origin="300 : 400 : 1"
- id="perspective24" />
- <linearGradient
- id="linearGradient3186">
- <stop
- style="stop-color:#ff0000;stop-opacity:1;"
- offset="0"
- id="stop3188" />
- <stop
- id="stop3194"
- offset="0.5"
- style="stop-color:#ffffff;stop-opacity:1;" />
- <stop
- style="stop-color:#ff0000;stop-opacity:1;"
- offset="1"
- id="stop3190" />
- </linearGradient>
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="-50 : 600 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="700 : 600 : 1"
- inkscape:persp3d-origin="300 : 400 : 1"
- id="perspective10" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3186"
- id="linearGradient3192"
- x1="5.3350925"
- y1="6.0993748"
- x2="7.3876858"
- y2="12.259375"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-10e-2,-1.8)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3186"
- id="linearGradient3196"
- x1="11.69074"
- y1="4.8200002"
- x2="13.4933"
- y2="9.000001"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-10e-2,-1.8)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3186"
- id="linearGradient3198"
- x1="8.4300299"
- y1="7.3143148"
- x2="8.8612204"
- y2="10.414315"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-10e-2,-1.8)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3186"
- id="linearGradient3200"
- x1="2.3299999"
- y1="6.6100001"
- x2="4.7900004"
- y2="6.5100002"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(-10e-2,-1.8)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3186"
- id="linearGradient3257"
- x1="8"
- y1="4"
- x2="8"
- y2="10"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3186"
- id="linearGradient3286"
- x1="8"
- y1="3.96875"
- x2="8"
- y2="9.96875"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(0,-0.96875)" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="50"
- inkscape:cx="7.9134759"
- inkscape:cy="8.287091"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showgrid="true"
- inkscape:window-width="1280"
- inkscape:window-height="968"
- inkscape:window-x="0"
- inkscape:window-y="22"
- showguides="true"
- inkscape:guide-bbox="true">
- <sodipodi:guide
- orientation="0,1"
- position="1.66,13.02"
- id="guide3236" />
- <sodipodi:guide
- orientation="0,1"
- position="1.26,5"
- id="guide3238" />
- <inkscape:grid
- type="xygrid"
- id="grid3259"
- visible="true"
- enabled="true" />
- </sodipodi:namedview>
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <rect
- style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect3261"
- width="2"
- height="4"
- x="4"
- y="10.03125" />
- <rect
- style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="rect3263"
- width="2"
- height="4"
- x="10"
- y="10.03125" />
- <path
- style="fill:url(#linearGradient3286);fill-opacity:1;stroke:#000000;stroke-width:0.50000000000000000;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 3,2 C 1.896,2 1,3.8177299 1,6.03125 C 1,8.2447701 1.896,10.03125 3,10.03125 L 13,10.03125 C 14.104,10.03125 15,8.2447701 15,6.03125 C 15,3.8177299 14.104,2 13,2 L 3,2 z"
- id="path3269" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="100"
- height="100"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- version="1.0"
- inkscape:export-filename="D:\dev\icons\translate_d.png"
- inkscape:export-xdpi="14"
- inkscape:export-ydpi="14"
- sodipodi:docname="translate_d.svg"
- sodipodi:docbase="D:\dev\icons">
- <defs
- id="defs4">
- <linearGradient
- id="linearGradient2184">
- <stop
- style="stop-color:#2aae3a;stop-opacity:1;"
- offset="0"
- id="stop2186" />
- <stop
- style="stop-color:#2aae3a;stop-opacity:0;"
- offset="1"
- id="stop2188" />
- </linearGradient>
- <linearGradient
- id="linearGradient3146">
- <stop
- style="stop-color:#0000ff;stop-opacity:1;"
- offset="0"
- id="stop3148" />
- <stop
- id="stop3156"
- offset="0.5"
- style="stop-color:#006eff;stop-opacity:1;" />
- <stop
- style="stop-color:#00ffff;stop-opacity:1;"
- offset="0.75"
- id="stop3158" />
- <stop
- style="stop-color:#0079ff;stop-opacity:1;"
- offset="1"
- id="stop3150" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2184"
- id="linearGradient2190"
- x1="8.00577"
- y1="50.15"
- x2="92.29423"
- y2="50.15"
- gradientUnits="userSpaceOnUse" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient2184"
- id="radialGradient4579"
- cx="50"
- cy="50"
- fx="50"
- fy="50"
- r="52"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.809436,0,0,0.809436,9.463433,9.592966)" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="7.72"
- inkscape:cx="50"
- inkscape:cy="55.181347"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- width="100px"
- height="100px"
- inkscape:window-width="1280"
- inkscape:window-height="968"
- inkscape:window-x="-4"
- inkscape:window-y="-4" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <path
- style="fill:url(#radialGradient4579);fill-opacity:1;fill-rule:evenodd;stroke:#009c00;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 25.652153,41.970406 L 25.652153,33.876046 L 9.4634316,50.064767 L 25.652153,66.253488 L 25.652153,58.159127 L 74.218314,58.159127 L 74.218314,66.253488 L 90.407036,50.064767 L 74.218314,33.876046 L 74.218314,41.970406 L 25.652153,41.970406 z "
- id="path1879"
- sodipodi:nodetypes="ccccccccccc" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="744.09448819"
- height="1052.3622047"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- sodipodi:docbase="D:\dev\icons"
- sodipodi:docname="x-axis.svg"
- inkscape:export-filename="D:\dev\icons\x-axis.png"
- inkscape:export-xdpi="14.4"
- inkscape:export-ydpi="14.4">
- <defs
- id="defs4" />
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="7.7183778"
- inkscape:cx="50"
- inkscape:cy="49.989491"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showguides="true"
- inkscape:guide-bbox="true"
- inkscape:window-width="1280"
- inkscape:window-height="968"
- inkscape:window-x="-4"
- inkscape:window-y="-4" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <rect
- style="fill:#00fd00;fill-opacity:0;stroke:none;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect1958"
- width="100"
- height="100"
- x="0"
- y="952.36218" />
- <text
- xml:space="preserve"
- style="font-size:79.64511871px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
- x="22.170273"
- y="1016.5383"
- id="text2846"><tspan
- sodipodi:role="line"
- id="tspan2848"
- x="22.170273"
- y="1016.5383">X</tspan></text>
- <path
- style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 89.651844,1031.0133 L 4.4186832,1031.0133 M 77.083149,1048.3832 L 94.286422,1031.1799 L 77.551265,1014.4447"
- id="path2850"
- sodipodi:nodetypes="cc" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="744.09448819"
- height="1052.3622047"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- sodipodi:docbase="D:\dev\icons"
- sodipodi:docname="x-plane.svg"
- inkscape:export-filename="D:\dev\icons\x-plane.png"
- inkscape:export-xdpi="14.4"
- inkscape:export-ydpi="14.4">
- <defs
- id="defs4" />
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="7.7183778"
- inkscape:cx="50"
- inkscape:cy="63.68827"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showguides="true"
- inkscape:guide-bbox="true"
- inkscape:window-width="1280"
- inkscape:window-height="968"
- inkscape:window-x="-4"
- inkscape:window-y="-4" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <rect
- style="fill:#00fd00;fill-opacity:0;stroke:none;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect1958"
- width="100"
- height="100"
- x="0"
- y="952.36218" />
- <text
- xml:space="preserve"
- style="font-size:90.08292227;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
- x="28.756321"
- y="1082.9758"
- id="text2846"
- sodipodi:linespacing="125%"
- transform="scale(1.065357,0.938653)"><tspan
- sodipodi:role="line"
- id="tspan4650"
- x="28.756321"
- y="1082.9758">X</tspan></text>
- <path
- style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 89.651844,1031.0133 L 16.726969,1031.0133 M 77.083149,1048.3832 L 94.286422,1031.1799 L 77.551265,1031.0285"
- id="path2850"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 20.588217,963.08889 L 20.588217,1034.8478 M 20.596956,975.65763 L 20.754816,958.45431 L 4.0196163,975.18943"
- id="path4646"
- sodipodi:nodetypes="ccccc" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="744.09448819"
- height="1052.3622047"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- sodipodi:docbase="D:\dev\icons"
- sodipodi:docname="y-axis.svg"
- inkscape:export-filename="D:\dev\icons\y-axis.png"
- inkscape:export-xdpi="14.4"
- inkscape:export-ydpi="14.4">
- <defs
- id="defs4" />
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="7.7183778"
- inkscape:cx="50"
- inkscape:cy="49.989491"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showguides="true"
- inkscape:guide-bbox="true"
- inkscape:window-width="1280"
- inkscape:window-height="968"
- inkscape:window-x="-4"
- inkscape:window-y="-4" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <rect
- style="fill:#00fd00;fill-opacity:0;stroke:none;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect1958"
- width="100"
- height="100"
- x="0"
- y="952.36218" />
- <text
- xml:space="preserve"
- style="font-size:79.64511871;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%"
- x="22.170273"
- y="1016.5383"
- id="text2846"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan4642"
- x="22.170273"
- y="1016.5383">Y</tspan></text>
- <path
- style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 89.651844,1031.0133 L 4.4186832,1031.0133 M 77.083149,1048.3832 L 94.286422,1031.1799 L 77.551265,1014.4447"
- id="path2850"
- sodipodi:nodetypes="cc" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="744.09448819"
- height="1052.3622047"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- sodipodi:docbase="D:\dev\icons"
- sodipodi:docname="y-plane.svg"
- inkscape:export-filename="D:\dev\icons\y-plane.png"
- inkscape:export-xdpi="14.4"
- inkscape:export-ydpi="14.4">
- <defs
- id="defs4" />
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="7.7183778"
- inkscape:cx="50"
- inkscape:cy="63.68827"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showguides="true"
- inkscape:guide-bbox="true"
- inkscape:window-width="1280"
- inkscape:window-height="968"
- inkscape:window-x="-4"
- inkscape:window-y="-4" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <rect
- style="fill:#00fd00;fill-opacity:0;stroke:none;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect1958"
- width="100"
- height="100"
- x="0"
- y="952.36218" />
- <text
- xml:space="preserve"
- style="font-size:90.08292227;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
- x="28.756321"
- y="1082.9758"
- id="text2846"
- sodipodi:linespacing="125%"
- transform="scale(1.065357,0.938653)"><tspan
- sodipodi:role="line"
- id="tspan4648"
- x="28.756321"
- y="1082.9758">Y</tspan></text>
- <path
- style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 89.651844,1031.0133 L 16.726969,1031.0133 M 77.083149,1048.3832 L 94.286422,1031.1799 L 77.551265,1031.0285"
- id="path2850"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 20.588217,963.08889 L 20.588217,1034.8478 M 20.596956,975.65763 L 20.754816,958.45431 L 4.0196163,975.18943"
- id="path4646"
- sodipodi:nodetypes="ccccc" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="744.09448819"
- height="1052.3622047"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- sodipodi:docbase="D:\dev\icons"
- sodipodi:docname="z-axis.svg"
- inkscape:export-filename="D:\dev\icons\z-axis.png"
- inkscape:export-xdpi="14.4"
- inkscape:export-ydpi="14.4">
- <defs
- id="defs4" />
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="7.7183778"
- inkscape:cx="50"
- inkscape:cy="49.989491"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showguides="true"
- inkscape:guide-bbox="true"
- inkscape:window-width="1280"
- inkscape:window-height="968"
- inkscape:window-x="-4"
- inkscape:window-y="-4" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <rect
- style="fill:#00fd00;fill-opacity:0;stroke:none;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect1958"
- width="100"
- height="100"
- x="0"
- y="952.36218" />
- <text
- xml:space="preserve"
- style="font-size:79.64511871px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
- x="20.097298"
- y="1016.5383"
- id="text2846"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan4644"
- x="20.097298"
- y="1016.5383">Z</tspan></text>
- <path
- style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 89.651844,1031.0133 L 4.4186832,1031.0133 M 77.083149,1048.3832 L 94.286422,1031.1799 L 77.551265,1014.4447"
- id="path2850"
- sodipodi:nodetypes="cc" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://web.resource.org/cc/"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="744.09448819"
- height="1052.3622047"
- id="svg2"
- sodipodi:version="0.32"
- inkscape:version="0.44"
- sodipodi:docbase="D:\dev\icons"
- sodipodi:docname="z-plane.svg"
- inkscape:export-filename="D:\dev\icons\z-plane.png"
- inkscape:export-xdpi="14.4"
- inkscape:export-ydpi="14.4">
- <defs
- id="defs4" />
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- gridtolerance="10000"
- guidetolerance="10"
- objecttolerance="10"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="7.7183778"
- inkscape:cx="50"
- inkscape:cy="63.68827"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showguides="true"
- inkscape:guide-bbox="true"
- inkscape:window-width="1280"
- inkscape:window-height="968"
- inkscape:window-x="-4"
- inkscape:window-y="-4" />
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
- <rect
- style="fill:#00fd00;fill-opacity:0;stroke:none;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="rect1958"
- width="100"
- height="100"
- x="0"
- y="952.36218" />
- <text
- xml:space="preserve"
- style="font-size:90.08292389px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
- x="28.756321"
- y="1082.9758"
- id="text2846"
- sodipodi:linespacing="125%"
- transform="scale(1.065357,0.938653)"><tspan
- sodipodi:role="line"
- id="tspan4644"
- x="28.756321"
- y="1082.9758">Z</tspan></text>
- <path
- style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 89.651844,1031.0133 L 16.726969,1031.0133 M 77.083149,1048.3832 L 94.286422,1031.1799 L 77.551265,1031.0285"
- id="path2850"
- sodipodi:nodetypes="ccccc" />
- <path
- style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:black;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 20.588217,963.08889 L 20.588217,1034.8478 M 20.596956,975.65763 L 20.754816,958.45431 L 4.0196163,975.18943"
- id="path4646"
- sodipodi:nodetypes="ccccc" />
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<?eclipse version="3.2"?>\r
-<plugin>\r
- <extension\r
- point="org.simantics.db.resourceAdapter">\r
- <resource_adapter\r
- adapter_class="org.simantics.processeditor.handlers.Plant3DProjectAdapter"\r
- operation="http://www.vtt.fi/Simantics/Layer0/1.0/Relations#HasProjectTypeAdapter"\r
- type_uri="http://www.vtt.fi/Simantics/Plant3D/1.0/Types#Plant3DProjectType">\r
- </resource_adapter>\r
- <resource_adapter\r
- adapter_class="org.simantics.processeditor.adapters.NozzleConstraintAdapter"\r
- operation="http://www.vtt.fi/Simantics/G3D/1.0/Relations#HasConstraints"\r
- type_uri="http://www.vtt.fi/Simantics/Plant3D/1.0/Types#Nozzle">\r
- </resource_adapter>\r
- <resource_adapter\r
- adapter_class="org.simantics.processeditor.adapters.InlineComponentConstraintAdapter"\r
- operation="http://www.vtt.fi/Simantics/G3D/1.0/Relations#HasConstraints"\r
- type_uri="http://www.vtt.fi/Simantics/Plant3D/1.0/Types#InlineComponent">\r
- </resource_adapter>\r
- <resource_adapter\r
- adapter_class="org.simantics.processeditor.adapters.TurnComponentConstraintAdapter"\r
- operation="http://www.vtt.fi/Simantics/G3D/1.0/Relations#HasConstraints"\r
- type_uri="http://www.vtt.fi/Simantics/Plant3D/1.0/Types#TurnComponent">\r
- </resource_adapter>\r
- </extension>\r
- <extension\r
- point="org.eclipse.ui.editors">\r
- <editor\r
- class="org.simantics.processeditor.views.ProcessEditorPart"\r
- icon="icons/factory.png"\r
- id="org.simantics.proconf.processeditor.planteditor"\r
- name="Plant Editor">\r
- </editor>\r
- <editor\r
- class="org.simantics.processeditor.views.PipelineComponentEditorPart"\r
- icon="icons/Component.png"\r
- id="org.simantics.proconf.processeditor.componenteditor"\r
- name="Component Editor">\r
- </editor>\r
- <editor\r
- class="org.simantics.processeditor.views.EquipmentEditorPart"\r
- icon="icons/tank.png"\r
- id="org.simantics.proconf.processeditor.equipmenteditor"\r
- name="Equipment Editor">\r
- </editor>\r
- </extension>\r
- <extension\r
- point="org.eclipse.ui.views">\r
- <view\r
- class="org.simantics.processeditor.views.PlantStructureView"\r
- icon="icons/factory.png"\r
- id="org.simantics.proconf.processeditor.plantstructure"\r
- name="Plant Structure">\r
- </view>\r
- </extension>\r
- <extension\r
- point="org.eclipse.ui.commands">\r
- <command\r
- categoryId="org.simantics.proconf.processeditor.commands"\r
- description="New Pipeline Component"\r
- id="org.simantics.proconf.processeditor.commands.newComponent"\r
- name="New Pipeline Component">\r
- </command>\r
- <command\r
- categoryId="org.simantics.proconf.processeditor.commands"\r
- description="New Equipment"\r
- id="org.simantics.proconf.processeditor.commands.newEquipment"\r
- name="New Equipment">\r
- </command>\r
- <command\r
- categoryId="org.simantics.proconf.processeditor.commands"\r
- description="New Plant"\r
- id="org.simantics.proconf.processeditor.commands.newPlant"\r
- name="New Plant">\r
- </command>\r
- <category\r
- id="org.simantics.proconf.processeditor.commands"\r
- name="Plant3D Commands">\r
- </category>\r
- </extension>\r
- <extension\r
- point="org.eclipse.ui.handlers">\r
- <handler\r
- class="org.simantics.processeditor.handlers.NewPlantHandler"\r
- commandId="org.simantics.proconf.processeditor.commands.newPlant">\r
- </handler>\r
- <handler\r
- class="org.simantics.processeditor.handlers.NewEquipmentHandler"\r
- commandId="org.simantics.proconf.processeditor.commands.newEquipment">\r
- </handler>\r
- <handler\r
- class="org.simantics.processeditor.handlers.NewComponentHandler"\r
- commandId="org.simantics.proconf.processeditor.commands.newComponent">\r
- </handler>\r
- </extension>\r
- <extension\r
- point="org.eclipse.ui.menus">\r
- <menuContribution\r
- locationURI="popup:#OEPopup?after=additions">\r
- <command\r
- commandId="org.simantics.proconf.processeditor.commands.newPlant"\r
- icon="icons/factory.png"\r
- id="org.simantics.proconf.processeditor.popups.newPlant"\r
- label="New Plant"\r
- style="push">\r
- <visibleWhen>\r
- <and>\r
- <with\r
- variable="activeContexts">\r
- <iterate\r
- ifEmpty="false"\r
- operator="or">\r
- <equals\r
- value="org.simantics.proconf.processeditor.plantmodelling">\r
- </equals>\r
- </iterate>\r
- </with>\r
- <with\r
- variable="selection">\r
- <and>\r
- <test\r
- args="http://www.vtt.fi/Simantics/Layer0/1.0/Types#Library"\r
- property="org.simantics.graph.resourceType">\r
- </test>\r
- </and>\r
- </with>\r
- </and>\r
- </visibleWhen>\r
- </command>\r
- <command\r
- commandId="org.simantics.proconf.processeditor.commands.newEquipment"\r
- icon="icons/tank.png"\r
- id="org.simantics.proconf.processeditor.popups.newEquipment"\r
- label="New Equipment"\r
- style="push">\r
- <visibleWhen>\r
- <and>\r
- <with\r
- variable="activeContexts">\r
- <iterate\r
- ifEmpty="false"\r
- operator="or">\r
- <equals\r
- value="org.simantics.proconf.processeditor.plantmodelling">\r
- </equals>\r
- </iterate>\r
- </with>\r
- <with\r
- variable="selection">\r
- <and>\r
- <test\r
- args="http://www.vtt.fi/Simantics/Layer0/1.0/Types#Library"\r
- property="org.simantics.graph.resourceType">\r
- </test>\r
- </and>\r
- </with>\r
- </and>\r
- </visibleWhen>\r
- </command>\r
- <command\r
- commandId="org.simantics.proconf.processeditor.commands.newComponent"\r
- icon="icons/Component.png"\r
- id="org.simantics.proconf.processeditor.popups.newComponent"\r
- label="New Component"\r
- style="push">\r
- <visibleWhen>\r
- <and>\r
- <with\r
- variable="activeContexts">\r
- <iterate\r
- ifEmpty="false"\r
- operator="or">\r
- <equals\r
- value="org.simantics.proconf.processeditor.plantmodelling">\r
- </equals>\r
- </iterate>\r
- </with>\r
- <with\r
- variable="selection">\r
- <and>\r
- <test\r
- args="http://www.vtt.fi/Simantics/Layer0/1.0/Types#Library"\r
- property="org.simantics.graph.resourceType">\r
- </test>\r
- </and>\r
- </with>\r
- </and>\r
- </visibleWhen>\r
- </command>\r
- </menuContribution>\r
- </extension>\r
- <extension\r
- point="org.simantics.ui.resourceEditorAdapter">\r
- <adapterClass\r
- class="org.simantics.processeditor.handlers.Plant3DEditorAdapter"\r
- id="org.simantics.proconf.processeditor.ResourceEditorDescription1">\r
- </adapterClass>\r
- <adapterClass\r
- class="org.simantics.processeditor.handlers.PipelineComponentEditorAdapter"\r
- id="org.simantics.proconf.processeditor.ResourceEditorDescription2">\r
- </adapterClass>\r
- <adapterClass\r
- class="org.simantics.processeditor.handlers.EquipmentEditorAdapter"\r
- id="org.simantics.proconf.processeditor.ResourceEditorDescription3">\r
- </adapterClass>\r
- </extension>\r
- <extension\r
- point="org.eclipse.ui.perspectives">\r
- <perspective\r
- class="org.simantics.processeditor.perspectives.Plant3DModellingPerspective"\r
- icon="icons/factory.png"\r
- id="org.simantics.proconf.processeditor.plantmodelling"\r
- name="3D Plant Modelling">\r
- </perspective>\r
- </extension>\r
- <extension\r
- point="org.eclipse.ui.perspectiveExtensions">\r
- <perspectiveExtension\r
- targetID="org.simantics.proconf.processeditor.plantmodelling">\r
- <view\r
- id="org.simantics.proconf.processeditor.plantstructure"\r
- ratio="0.3"\r
- relationship="left"\r
- relative="org.eclipse.ui.editorss"\r
- visible="true">\r
- </view>\r
- <view\r
- id="org.simantics.proconf.browsing.views.property"\r
- ratio="0.7"\r
- relationship="bottom"\r
- relative="org.simantics.proconf.processeditor.plantstructure"\r
- visible="true">\r
- </view>\r
- <view\r
- id="org.eclipse.pde.runtime.LogView"\r
- relationship="fast"\r
- relative="fi.vtt.proconf.ui.views.property"\r
- visible="false">\r
- </view>\r
- </perspectiveExtension>\r
- </extension>\r
- <extension\r
- point="org.simantics.proconf.g3d.geometry">\r
- <Geometry\r
- class="org.simantics.processeditor.common.PipeComponentProvider"\r
- id="org.simantics.proconf.processeditor.Geometry1">\r
- </Geometry>\r
- </extension>\r
- <extension\r
- point="org.simantics.ui.perspectiveContextBinding">\r
- <binding\r
- contextIds="org.simantics.proconf.processeditor.plantmodelling"\r
- perspectiveId="org.simantics.proconf.processeditor.plantmodelling">\r
- </binding>\r
- </extension>\r
- <extension\r
- point="org.eclipse.ui.contexts">\r
- <context\r
- id="org.simantics.proconf.processeditor.plantmodelling"\r
- name="Plant Modelling"\r
- parentId="org.eclipse.ui.contexts.window">\r
- </context>\r
- </extension>\r
-\r
-</plugin>\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor;\r
-\r
-import org.eclipse.ui.plugin.AbstractUIPlugin;\r
-import org.osgi.framework.BundleContext;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.management.ISessionContext;\r
-import org.simantics.db.management.ISessionContextChangedListener;\r
-import org.simantics.db.management.SessionContextChangedEvent;\r
-import org.simantics.proconf.ui.ProConfUI;\r
-\r
-\r
-\r
-\r
-/**\r
- * The activator class controls the plug-in life cycle\r
- */\r
-public class Activator extends AbstractUIPlugin {\r
-\r
- // The plug-in ID\r
- public static final String PLUGIN_ID = "org.simantics.processeditor";\r
-\r
- // The shared instance\r
- private static Activator plugin;\r
- \r
- /**\r
- * The constructor\r
- */\r
- public Activator() {\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)\r
- */\r
- public void start(BundleContext context) throws Exception {\r
- super.start(context);\r
- plugin = this;\r
- ProConfUI.getSessionContextProvider().addContextChangedListener(new ISessionContextChangedListener() {\r
- @Override\r
- public void sessionContextChanged(SessionContextChangedEvent event) {\r
- ISessionContext ctx = event.getNewValue();\r
- if (ctx != null) {\r
- ctx.getSession().asyncRead(new GraphRequestAdapter() {\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- ProcessResource.initialize(g);\r
- return GraphRequestStatus.transactionComplete();\r
- };\r
- });\r
- } else {\r
- ProcessResource.deinitialize();\r
- }\r
- }\r
- });\r
- try {\r
- ProConfUI.getSession().asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- ProcessResource.initialize(g);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- } catch (Exception e) {\r
- \r
- }\r
- }\r
-\r
- /*\r
- * (non-Javadoc)\r
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)\r
- */\r
- public void stop(BundleContext context) throws Exception {\r
- plugin = null;\r
- super.stop(context);\r
- }\r
-\r
- /**\r
- * Returns the shared instance\r
- *\r
- * @return the shared instance\r
- */\r
- public static Activator getDefault() {\r
- return plugin;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor;\r
-\r
-import org.simantics.db.Builtins;\r
-import org.simantics.db.Graph;\r
-import org.simantics.processeditor.common.ControlPointTools;\r
-import org.simantics.processeditor.stubs.Plant3DResource;\r
-import org.simantics.proconf.g3d.stubs.G3DResource;\r
-\r
-\r
-public class ProcessResource {\r
- public static Builtins builtins;\r
- public static G3DResource g3dResource;\r
- public static Plant3DResource plant3Dresource;\r
- \r
- \r
- public static void initialize(Graph g) {\r
- ProcessResource.builtins = Builtins.getInstance(g);\r
- ProcessResource.g3dResource = G3DResource.getInstance(g);\r
- ProcessResource.plant3Dresource = Plant3DResource.getInstance(g);\r
- ControlPointTools.initialize();\r
- }\r
- \r
- public static void deinitialize() {\r
- builtins = null;\r
- g3dResource = null;\r
- plant3Dresource = null;\r
- ControlPointTools.deinitialize();\r
- }\r
- \r
- public static boolean isInitialized() {\r
- return builtins != null;\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.actions;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.simantics.processeditor.Activator;\r
-import org.simantics.processeditor.dialogs.FloorConfigureDialog;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-\r
-import com.jme.math.Vector3f;\r
-import com.jme.scene.Geometry;\r
-\r
-public class ConfigureFloorAction extends Action {\r
- \r
- Geometry floorShape;\r
- ThreeDimensionalEditorBase editor;\r
- \r
- public ConfigureFloorAction(ThreeDimensionalEditorBase editor) {\r
- setText("Configure floor");\r
- setImageDescriptor(Activator.imageDescriptorFromPlugin("fi.vtt.proconf.ode", "icons/silk/shape_align_bottom.png"));\r
- this.editor = editor;\r
- }\r
- \r
- public void run() {\r
- if (floorShape == null)\r
- throw new NullPointerException("FloorShape is null");\r
- FloorConfigureDialog dialog = new FloorConfigureDialog(editor.getRenderingComposite().getShell());\r
- if (dialog.open() == FloorConfigureDialog.CANCEL)\r
- return;\r
- if (dialog.isFloorEnabled()) {\r
- if (floorShape.getParent() == null)\r
- editor.getRenderingComponent().getNoCastRoot().attachChild(floorShape);\r
- } else {\r
- floorShape.removeFromParent();\r
- }\r
- floorShape.setLocalTranslation(new Vector3f(0.f,(float)dialog.getFloorHeight(),0.f));\r
- \r
- }\r
- \r
- public void setFloorShape(Geometry floorShape) {\r
- this.floorShape = floorShape;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.actions;\r
-\r
-import java.awt.event.KeyEvent;\r
-import java.awt.event.MouseEvent;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import javax.vecmath.Point3d;\r
-\r
-import org.eclipse.swt.widgets.Display;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.GraphRequestWithResult;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.processeditor.Activator;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.common.ControlPointTools;\r
-import org.simantics.processeditor.common.PipingTools2;\r
-import org.simantics.processeditor.common.PipingTools2.Direction;\r
-import org.simantics.processeditor.dialogs.PipelineComponentDialog;\r
-import org.simantics.processeditor.gizmo.PositionSelectionGizmo;\r
-import org.simantics.processeditor.stubs.PipeControlPoint;\r
-import org.simantics.processeditor.stubs.PipelineComponent;\r
-import org.simantics.proconf.g3d.actions.InteractiveAction;\r
-import org.simantics.proconf.g3d.base.G3DAPI;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-import org.simantics.proconf.g3d.dnd.DropListener;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.utils.datastructures.Pair;\r
-\r
-\r
-\r
-\r
-/**\r
- * Action that inserts new components into pipe run.\r
- * - VariableLengthInlineComponents cannot be inserted with this action\r
- * - Assumes that SizeChangeComponent is dual connected\r
- * \r
- * \r
- * @author Marko Luukkainen <Marko.Luukkainen@vtt.fi>\r
- *\r
- */\r
-public class InsertComponentAction extends InteractiveAction implements DropListener, SplitPointListener {\r
-\r
- Resource typeResource; // type of inserted component\r
- Resource targetResource; // component where we are inserting new one\r
- Resource selectedPosition; // selected control point for insertion\r
- PositionType selectedType; // selected position type\r
- List<Pair<Resource, PositionType>> insertPositions;\r
- List<Pair<Point3d, PositionType>> insertPoints;\r
- PositionSelectionGizmo gizmo = null;\r
- \r
- boolean activated = false;\r
- \r
- private SelectSplitPointAction splitPointAction;\r
- \r
- public InsertComponentAction(ThreeDimensionalEditorBase parent) {\r
- super(parent);\r
- splitPointAction = new SelectSplitPointAction(parent,this);\r
- }\r
- \r
- @Override\r
- public void init() {\r
- this.setText("Insert Component");\r
- this.setToolTipText("Inserts a Component into Pipeline");\r
- this.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/Component.png"));\r
- }\r
- \r
- @Override\r
- public boolean usable(Graph graph, List<Resource> resources) {\r
- if (!(resources.size() == 1)) {\r
- return false;\r
- }\r
- IEntity target = EntityFactory.create(graph,resources.get(0));\r
- \r
- if (!target.isInstanceOf(ProcessResource.plant3Dresource.PipelineComponent)) {\r
- return false;\r
- }\r
- PipelineComponent ic = new PipelineComponent(target);\r
- PipeControlPoint pcp = ic.getControlPoint();\r
- // one possibility: adding new component to unconnected position\r
- // TODO : how about inserting new components between existing ones.\r
- // TODO : can there be fixed length components that can be split (for example fixed length pipe)\r
- if (pcp.getNext() == null && pcp.getPrevious() == null)\r
- return true;\r
- if (ic.isInstanceOf(ProcessResource.plant3Dresource.InlineComponent) && (pcp.getNext() == null || pcp.getPrevious() == null))\r
- return true;\r
- for (PipeControlPoint p : pcp.getSubPoint())\r
- // SubPoint's other connection is always null\r
- // Exception: size change components offset point (that is subpoint)\r
- // does have one or both ends connected, but it won't matter\r
- // here because previous test fould return true, if insertion\r
- // is possible:\r
- // TODO : here we assume that Size Change Component is dual connected\r
- if (p.getNext() == null && p.getPrevious() == null) \r
- return true;\r
- \r
- if (target.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthInlineComponent)) {\r
- // last option to insert component is split variable length component.\r
- // If user chooses to split the component, inserted component must be\r
- // inline component, but not size change component\r
- return true;\r
- } \r
- return false;\r
- }\r
- \r
- @Override\r
- public void activate() {\r
- insertPositions = null;\r
- if (targetResource == null) {\r
- List<IGraphicsNode> mos = parent.getSelectionAdapter().getSelectedObjects();\r
- if (mos.size() != 1) {\r
- end();\r
- return;\r
- }\r
- IGraphicsNode startNode = mos.get(0);\r
- targetResource = startNode.getResource();\r
- }\r
- if (selectedPosition == null) {\r
- updateInsertPositions();\r
- }\r
- if (typeResource == null) {\r
- \r
- List<Resource> filter = new ArrayList<Resource>();\r
- filter.add(ProcessResource.plant3Dresource.VariableLengthInlineComponent);\r
- \r
- boolean containsEnd = false;\r
- for (Pair<Point3d, PositionType> p : insertPoints) {\r
- if (p.second == PositionType.NEXT || p.second == PositionType.PREVIOUS) {\r
- containsEnd = true;\r
- break;\r
- }\r
- \r
- }\r
- if(!containsEnd)\r
- filter.add(ProcessResource.plant3Dresource.EndComponent);\r
- \r
- PipelineComponentDialog dialog = new PipelineComponentDialog(Display.getCurrent().getActiveShell(),null, filter , parent.getSession());\r
- if (dialog.open() == PipelineComponentDialog.CANCEL) {\r
- end();\r
- return;\r
- }\r
- typeResource = dialog.getComboValue();\r
- updateInsertPositions();\r
- }\r
- \r
- activated = true;\r
- }\r
- \r
- private void updateInsertPositions() {\r
- parent.getSession().syncRead(new GraphRequestAdapter() {\r
- \r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- insertPositions = getInsertPositions(g,targetResource,typeResource);\r
- insertPoints = new ArrayList<Pair<Point3d,PositionType>>();\r
- for (Pair<Resource, PositionType> p : insertPositions) {\r
- IEntity entity = EntityFactory.create(g,p.first);\r
- Point3d pos = ControlPointTools.getRealPosition(entity, p.second);\r
- insertPoints.add(new Pair<Point3d, PositionType>(pos,p.second));\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- }\r
- \r
- /**\r
- * Finds possible locations of inserted component\r
- * \r
- * TODO (s): currently allows only inline, non size change components to split variable length component\r
- * assumes that size change component is DualConnected component\r
- * \r
- * @param g\r
- * @param target \r
- * @param acceptSplit\r
- * @return\r
- */\r
- private List<Pair<Resource, PositionType>> getInsertPositions(Graph g, Resource target, Resource typeResource) {\r
- \r
- boolean acceptSplit = true;\r
- boolean checkSubPoints = !g.isInstanceOf(target, ProcessResource.plant3Dresource.DualInlineControlPoint);\r
- if (typeResource != null)\r
- acceptSplit = g.isInstanceOf(typeResource, ProcessResource.plant3Dresource.InlineComponent) &&\r
- !g.isInstanceOf(typeResource, ProcessResource.plant3Dresource.SizeChangeComponent);\r
-\r
- \r
- List<Pair<Resource, PositionType>> insertPositions = new ArrayList<Pair<Resource,PositionType>>();\r
- PipelineComponent ic = new PipelineComponent(g,target);\r
- PipeControlPoint pcp = ic.getControlPoint();\r
- if (pcp.getNext() == null) {\r
- insertPositions.add(new Pair<Resource, PositionType>(pcp.getResource(),PositionType.NEXT));\r
- }\r
- if (pcp.getPrevious() == null) {\r
- insertPositions.add(new Pair<Resource, PositionType>(pcp.getResource(),PositionType.PREVIOUS));\r
- }\r
- if (checkSubPoints) {\r
- for (PipeControlPoint p : pcp.getSubPoint()) {\r
- if (p.getNext() == null && p.getPrevious() == null) {\r
- insertPositions.add(new Pair<Resource, PositionType>(p.getResource(),PositionType.PORT));\r
- }\r
- }\r
- }\r
- if (acceptSplit && ic.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthInlineComponent)) {\r
- insertPositions.add(new Pair<Resource, PositionType>(pcp.getResource(),PositionType.SPLIT));\r
- }\r
- return insertPositions;\r
- }\r
- \r
- @Override\r
- public void update() {\r
- if (splitPointAction.active()) {\r
- splitPointAction.update();\r
- return;\r
- }\r
- if (!activated) {\r
- return;\r
- }\r
- if (insertPositions == null)\r
- return;\r
- if (insertPositions.size() == 0) {\r
- end();\r
- return;\r
- }\r
- if (insertPositions.size() == 1) {\r
- activated = false;\r
- insertComponent(insertPositions.get(0));\r
- return;\r
- }\r
- \r
- if (gizmo == null) {\r
- gizmo = new PositionSelectionGizmo(parent,insertPoints);\r
- parent.setGizmo(gizmo);\r
- parent.getRenderingComponent().getNoShadowRoot().attachChild(gizmo.getNode());\r
- }\r
- gizmo.update();\r
- if (gizmo.getSelected() >= 0 && input.mouseClicked() && input.clickButton() == MouseEvent.BUTTON1) {\r
- activated = false;\r
- insertComponent(insertPositions.get(gizmo.getSelected()));\r
- }\r
- if (input.keyPressed(KeyEvent.VK_ESCAPE)) {\r
- end();\r
- }\r
- }\r
- \r
- private void insertComponent(Pair<Resource, PositionType> position) {\r
- selectedPosition = position.first;\r
- selectedType = position.second;\r
- switch (selectedType) {\r
- case NEXT:\r
- case PREVIOUS:\r
- case PORT:\r
- parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- IEntity pcp = EntityFactory.create(g,selectedPosition);\r
- Point3d point = ControlPointTools.getRealPosition(pcp, selectedType);\r
- IEntity component = instantiateComponent(g,point);\r
- PipingTools2.insertComponent(component, EntityFactory.create(g, targetResource), pcp , Direction.NEXT); \r
- endThreaded();\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- \r
- });\r
- break;\r
- case SPLIT:\r
- parent.getSession().asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- PipeControlPoint pcp = new PipeControlPoint(g,selectedPosition);\r
- Point3d p1 = new Point3d();\r
- Point3d p2 = new Point3d();\r
- ControlPointTools.getInlineControlPointEnds(pcp, p1, p2);\r
- splitPointAction.setSplit(p1, p2);\r
- splitPointAction.activate();\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- }); \r
- break;\r
- }\r
- }\r
- \r
- private void endThreaded() {\r
- parent.getRenderingComposite().getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- end();\r
- }\r
- });\r
- }\r
- \r
- @Override\r
- public void setSplitPoint(final Point3d point) {\r
- splitPointAction.deactivate();\r
- if (point == null) {\r
- end();\r
- return;\r
- }\r
- parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- IEntity component = instantiateComponent(g,point);\r
- PipingTools2.splitVariableLengthComponent(component, EntityFactory.create(g,targetResource));\r
- \r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- @Override\r
- public void requestCompleted(GraphRequestStatus status) {\r
- parent.getRenderingComposite().getDisplay().asyncExec(new Runnable(){\r
- @Override\r
- public void run() {\r
- end();\r
- \r
- }\r
- });\r
- }\r
- });\r
- }\r
- \r
- /**\r
- * instantiates selected component\r
- * @param worldPosition position of the new component\r
- */\r
- private PipelineComponent instantiateComponent(Graph g,Point3d worldPosition) {\r
- PipelineComponent target = new PipelineComponent(g,targetResource);\r
- IEntity piperun = target.getParent();\r
- PipelineComponent instance = PipingTools2.instantiatePipelineComponent(g,piperun.getResource(), typeResource);\r
- G3DTools.resetTransformation(instance);\r
- //G3DAPI.addNodeWorld(piperun, instance);\r
- G3DAPI.setWorldPosition(instance, worldPosition);\r
- return instance;\r
- }\r
- \r
- @Override\r
- public void deactivate() {\r
- typeResource = null;\r
- targetResource = null;\r
- selectedPosition = null;\r
- selectedType = null;\r
- insertPoints = null;\r
- insertPositions = null;\r
- if (gizmo != null) {\r
- parent.setGizmo(null);\r
- gizmo = null;\r
- }\r
- }\r
-\r
- public boolean acceptDrop(StructuredResourceSelection s, Resource[] ids) {\r
- if(s.size() != 1)\r
- return false;\r
- if (ids == null)\r
- return false;\r
- if (ids.length != 1)\r
- return false;\r
- \r
- final Resource type = ids[0];\r
- final Resource target = s.getSelectionList().get(0);\r
- GraphRequestWithResult<Boolean> query = new GraphRequestWithResult<Boolean>() {\r
- @Override\r
- public Boolean performWithResult(Graph g) throws Exception {\r
- IEntity entity = EntityFactory.create(g, type);\r
- // dropped type must be pipeline component\r
- if (!entity.isInstanceOf(ProcessResource.plant3Dresource.PipelineComponent))\r
- return false;\r
- // but not variable length inline component\r
- if (entity.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthInlineComponent))\r
- return false;\r
- if (entity.getRelatedObjects(ProcessResource.plant3Dresource.HasGraphics).size() != 1)\r
- return false;\r
- \r
- List<Pair<Resource, PositionType>> insertPositions = getInsertPositions(g,target,type);\r
- return insertPositions.size() > 0; \r
- }\r
- };\r
- \r
- parent.getSession().syncRead(query);\r
- \r
- return query.getResult();\r
- } \r
- \r
- public void doDrop(StructuredResourceSelection s, Resource[] ids) {\r
- typeResource = ids[0];\r
- targetResource = s.getSelectionList().get(0);\r
- parent.setCurrentAction(this);\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.actions;\r
-\r
-import java.util.List;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.GraphRequestWithResult;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.common.PipingTools2;\r
-import org.simantics.processeditor.dialogs.EquipmentDialog;\r
-import org.simantics.processeditor.stubs.Equipment;\r
-import org.simantics.proconf.g3d.actions.ContextAction;\r
-import org.simantics.proconf.g3d.base.G3DAPI;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-import org.simantics.proconf.g3d.dnd.DropListener;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-\r
-\r
-\r
-\r
-public class InsertEquipmentAction extends ContextAction implements DropListener{\r
-\r
- \r
- public InsertEquipmentAction(ThreeDimensionalEditorBase parent) {\r
- super(parent);\r
- this.setText("Insert Equipment");\r
- }\r
- \r
- @Override\r
- public void run() {\r
- EquipmentDialog dialog = new EquipmentDialog(parent.getRenderingComposite().getShell(),"Insert Equipment",parent.getSession());\r
- if (dialog.open() == EquipmentDialog.CANCEL)\r
- return;\r
- final Resource typeResource = dialog.getComboValue();\r
- parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- createEquipment(g,typeResource);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- }\r
- \r
- \r
-\r
- \r
- private void createEquipment(Graph graph,Resource typeResource) {\r
- \r
- //G3DNode instanceNode = new G3DNode(graph, instance);\r
- Equipment instanceNode = PipingTools2.instantiateEquipment(graph, typeResource);\r
- G3DNode plant = parent.getScenegraphAdapter().getRootNode().getG3DNode(graph); \r
- \r
- G3DAPI.addNodeWorld(plant, instanceNode);\r
-\r
- //parent.getSelectionAdapter().updateSelection(new StructuredResourceSelection(instance)));\r
- }\r
- \r
- public boolean usable(Graph graph,List<Resource> resources) {\r
- return (resources.size() == 0);\r
- }\r
- \r
-\r
- \r
- public boolean acceptDrop(StructuredResourceSelection s, Resource[] ids) {\r
- if(!s.isEmpty())\r
- return false;\r
- if (ids == null)\r
- return false;\r
- if (ids.length != 1)\r
- return false;\r
- final Resource r = ids[0];\r
- GraphRequestWithResult<Boolean> query = new GraphRequestWithResult<Boolean>() {\r
- @Override\r
- public Boolean performWithResult(Graph g) throws Exception {\r
- IEntity t = EntityFactory.create(g, r);\r
- if(!t.isInheritedFrom(ProcessResource.plant3Dresource.Equipment))\r
- return false;\r
- if (t.getRelatedObjects(ProcessResource.plant3Dresource.HasGraphics).size() == 1)\r
- return true;\r
- return false;\r
- }\r
- };\r
-\r
- parent.getSession().syncRead(query);\r
- return query.getResult();\r
- }\r
- \r
- public void doDrop(StructuredResourceSelection s, Resource[] ids) {\r
- final Resource typeResource = ids[0];\r
- parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- createEquipment(g,typeResource);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- \r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.actions;\r
-\r
-import java.util.List;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.GraphRequestWithResult;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.instantiation.Instance;\r
-import org.simantics.layer0.utils.instantiation.InstanceFactory;\r
-import org.simantics.processeditor.Activator;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.common.PipingTools2;\r
-import org.simantics.processeditor.dialogs.NozzleDialog;\r
-import org.simantics.processeditor.stubs.Equipment;\r
-import org.simantics.processeditor.stubs.Nozzle;\r
-import org.simantics.proconf.g3d.actions.WriteAction;\r
-import org.simantics.proconf.g3d.base.G3DAPI;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-import org.simantics.proconf.g3d.dnd.DropListener;\r
-\r
-\r
-\r
-\r
-public class InsertNozzleAction extends WriteAction implements DropListener {\r
-\r
- Resource equipmentResource = null;\r
- Resource nozzleType = null;\r
- \r
- public InsertNozzleAction(ThreeDimensionalEditorBase parent) {\r
- super(parent,false);\r
- }\r
-\r
- @Override\r
- public boolean canActivate() {\r
- NozzleDialog dialog = new NozzleDialog(parent.getRenderingComposite().getShell(),"Select a nozzle", parent.getSession());\r
- if (dialog.open() == NozzleDialog.CANCEL) {\r
- equipmentResource = null;\r
- return false;\r
- }\r
- Resource type = dialog.getComboValue();\r
- if (type == null) {\r
- equipmentResource = null;\r
- return false;\r
- }\r
- nozzleType = type; \r
- return true;\r
- }\r
- \r
- @Override\r
- public GraphRequestStatus doChanges(Graph graph) throws Exception {\r
- createNozzle(graph);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- private void createNozzle(Graph graph) {\r
- assert(nozzleType != null);\r
- assert(equipmentResource != null);\r
-\r
- Nozzle n = PipingTools2.instantiateNozzle(graph, nozzleType);\r
- \r
- Equipment equipment = new Equipment(graph, equipmentResource);\r
- \r
- G3DAPI.addNodeLocal(equipment,ProcessResource.plant3Dresource.HasNozzle, n);\r
- //parent.getSelectionAdapter().updateSelection(new StructuredResourceSelection(n.getResource())); \r
- equipment = null;\r
- }\r
- \r
- public boolean usable(Graph graph, List<Resource> resources) {\r
- if (resources.size() != 1) {\r
- return false;\r
- }\r
- Resource r = resources.iterator().next();\r
- IEntity t = EntityFactory.create(graph,r);\r
- if (t.isInstanceOf(ProcessResource.plant3Dresource.Equipment)) {\r
- equipmentResource = r;\r
- return true;\r
- }\r
- return false;\r
- }\r
- \r
- @Override\r
- public void init() {\r
- setText("Insert Nozzle");\r
- this.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/Nozzle.png"));\r
- }\r
- \r
- public boolean acceptDrop(StructuredResourceSelection s, Resource[] ids) {\r
- if(s.size() != 1)\r
- return false;\r
- if (ids == null)\r
- return false;\r
- if (ids.length != 1)\r
- return false;\r
- final Resource r = ids[0];\r
- final Resource selectedResource = s.iterator().next();\r
- GraphRequestWithResult<Boolean> query = new GraphRequestWithResult<Boolean>() {\r
- @Override\r
- public Boolean performWithResult(Graph g) throws Exception {\r
- IEntity t = EntityFactory.create(g,r);\r
- if (!t.isInheritedFrom(ProcessResource.plant3Dresource.Nozzle))\r
- return false;\r
- t = EntityFactory.create(g,selectedResource);\r
- if (t.isInstanceOf(ProcessResource.plant3Dresource.Equipment)) {\r
- return true;\r
- }\r
- return false;\r
- }\r
- };\r
- parent.getSession().syncRead(query);\r
- return query.getResult();\r
- }\r
- \r
- public void doDrop(StructuredResourceSelection s, Resource[] ids) {\r
- equipmentResource = s.iterator().next();\r
- parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- createNozzle(g);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.actions;\r
-\r
-\r
-/**\r
- * Position types for inserting new components and routing new pipe\r
- * \r
- * @author Marko Luukkainen <Marko.Luukkainen@vtt.fi>\r
- *\r
- */\r
-public enum PositionType {\r
- SPLIT,\r
- NEXT,\r
- PREVIOUS,\r
- PORT\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.actions;\r
-\r
-import java.util.List;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.common.PipingTools2;\r
-import org.simantics.processeditor.stubs.PipelineComponent;\r
-import org.simantics.proconf.g3d.actions.WriteAction;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-\r
-\r
-\r
-public class ReversePipelineAction extends WriteAction {\r
- \r
- public ReversePipelineAction(ThreeDimensionalEditorBase parent) {\r
- super(parent,false);\r
- }\r
-\r
- @Override\r
- public boolean usable(Graph graph, List<Resource> resources) {\r
- if (resources.size() != 1)\r
- return false;\r
- IEntity t = EntityFactory.create(graph, resources.get(0));\r
- return (t.isInstanceOf(ProcessResource.plant3Dresource.PipelineComponent));\r
- }\r
- \r
- @Override\r
- public GraphRequestStatus doChanges(Graph graph) throws Exception {\r
- Resource r = parent.getSelectionAdapter().getSelectedResources().get(0);\r
- PipelineComponent comp = new PipelineComponent(graph, r);\r
- PipingTools2.reversePipeRun(PipingTools2.getPipeRun(comp));\r
-\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
-\r
- \r
- @Override\r
- public void init() {\r
- this.setText("Reverse pipeline");\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.actions;\r
-\r
-import java.awt.event.KeyEvent;\r
-import java.awt.event.MouseEvent;\r
-import java.math.BigDecimal;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.eclipse.jface.resource.ImageDescriptor;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.GraphRequestWithResult;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.processeditor.Activator;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.common.ControlPointTools;\r
-import org.simantics.processeditor.common.PipeComponentProvider;\r
-import org.simantics.processeditor.common.PipingTools2;\r
-import org.simantics.processeditor.common.PipingTools2.Direction;\r
-import org.simantics.processeditor.dialogs.PipelineDialog;\r
-import org.simantics.processeditor.gizmo.PositionSelectionGizmo;\r
-import org.simantics.processeditor.stubs.BranchEndControlPoint;\r
-import org.simantics.processeditor.stubs.PipeControlPoint;\r
-import org.simantics.processeditor.stubs.PipeRun;\r
-import org.simantics.processeditor.stubs.PipelineComponent;\r
-import org.simantics.processeditor.stubs.VariableLengthInlineComponent;\r
-import org.simantics.processeditor.views.ProcessEditor;\r
-import org.simantics.proconf.g3d.actions.InteractiveAction;\r
-import org.simantics.proconf.g3d.base.ConstraintDetector;\r
-import org.simantics.proconf.g3d.base.G3DAPI;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.MathTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-import org.simantics.proconf.g3d.dnd.DropListener;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.utils.datastructures.Pair;\r
-\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.scene.Geometry;\r
-import com.jme.scene.Line;\r
-import com.jme.scene.state.MaterialState;\r
-\r
-\r
-/**\r
- * Action for Routing Pipes\r
- * \r
- * FIXME : does several thing that should be done by PipingTools.\r
- * TODO : instead of using lines to show route of pipe, generate pipe and change it real-time\r
- * \r
- * @author MLMARKO\r
- *\r
- */\r
-public class RoutePipeAction extends InteractiveAction implements DropListener, SplitPointListener {\r
- \r
- \r
- private static final ImageDescriptor X_AXIS_ICON = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/x-axis.png");\r
- private static final ImageDescriptor Y_AXIS_ICON = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/y-axis.png");\r
- private static final ImageDescriptor Z_AXIS_ICON = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/z-axis.png");\r
- private static final ImageDescriptor X_PLANE_ICON = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/x-plane.png");\r
- private static final ImageDescriptor Y_PLANE_ICON = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/y-plane.png");\r
- private static final ImageDescriptor Z_PLANE_ICON = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/z-plane.png");\r
- \r
- private static final ImageDescriptor CAMERA_ICON = Activator.imageDescriptorFromPlugin("org.simantics.proconf.g3d", "icons/eye.png");\r
- \r
- \r
- private Action xAxisAction;\r
- private Action yAxisAction;\r
- private Action zAxisAction;\r
- private Action xPlaneAction;\r
- private Action yPlaneAction;\r
- private Action zPlaneAction;\r
- \r
- private Action cameraAction;\r
- \r
- ConstraintDetector detector = null;\r
- \r
- public RoutePipeAction(ThreeDimensionalEditorBase parent) {\r
- super(parent);\r
- detector = new ConstraintDetector(parent);\r
- xAxisAction = new Action("X",Action.AS_RADIO_BUTTON) {\r
- public void run() {\r
- if (lock == LockType.X)\r
- setLockType(LockType.NONE,false);\r
- else\r
- setLockType(LockType.X,false);\r
- }\r
- };\r
- xAxisAction.setImageDescriptor(X_AXIS_ICON);\r
- xAxisAction.setToolTipText("Lock X-Axis");\r
- yAxisAction = new Action("Y",Action.AS_RADIO_BUTTON) {\r
- public void run() {\r
- if (lock == LockType.Y)\r
- setLockType(LockType.NONE,false);\r
- else\r
- setLockType(LockType.Y,false);\r
- }\r
- };\r
- yAxisAction.setImageDescriptor(Y_AXIS_ICON);\r
- yAxisAction.setToolTipText("Lock Y-Axis");\r
- zAxisAction = new Action("Z",Action.AS_RADIO_BUTTON) {\r
- public void run() {\r
- if (lock == LockType.Z)\r
- setLockType(LockType.NONE,false);\r
- else\r
- setLockType(LockType.Z,false);\r
- }\r
- };\r
- zAxisAction.setImageDescriptor(Z_AXIS_ICON);\r
- zAxisAction.setToolTipText("Lock Z-Axis");\r
- xPlaneAction = new Action("X",Action.AS_RADIO_BUTTON) {\r
- public void run() {\r
- if (lock == LockType.YZ)\r
- setLockType(LockType.NONE,false);\r
- else\r
- setLockType(LockType.YZ,false);\r
- }\r
- };\r
- xPlaneAction.setImageDescriptor(X_PLANE_ICON);\r
- xPlaneAction.setToolTipText("Lock X-Plane");\r
- yPlaneAction = new Action("Y",Action.AS_RADIO_BUTTON) {\r
- public void run() {\r
- if (lock == LockType.XZ)\r
- setLockType(LockType.NONE,false);\r
- else\r
- setLockType(LockType.XZ,false);\r
- }\r
- };\r
- yPlaneAction.setImageDescriptor(Y_PLANE_ICON);\r
- yPlaneAction.setToolTipText("Lock Y-Plane");\r
- zPlaneAction = new Action("Z",Action.AS_RADIO_BUTTON) {\r
- public void run() {\r
- if (lock == LockType.XY)\r
- setLockType(LockType.NONE,false);\r
- else\r
- setLockType(LockType.XY,false);\r
- }\r
- };\r
- zPlaneAction.setImageDescriptor(Z_PLANE_ICON);\r
- zPlaneAction.setToolTipText("Lock Z-Plane");\r
- cameraAction = new Action("C", Action.AS_CHECK_BOX) {\r
- public void run() {\r
- useCamera = this.isChecked();\r
- }\r
- };\r
- cameraAction.setImageDescriptor(CAMERA_ICON);\r
- cameraAction.setToolTipText("Use camera");\r
- splitPointAction = new SelectSplitPointAction(parent,this);\r
- \r
- }\r
- \r
- public void fillToolBar(IToolBarManager manager) {\r
- \r
- manager.add(cameraAction);\r
- cameraAction.setChecked(useCamera);\r
- manager.add(xAxisAction);\r
- manager.add(yAxisAction);\r
- manager.add(zAxisAction);\r
- manager.add(xPlaneAction);\r
- manager.add(yPlaneAction);\r
- manager.add(zPlaneAction); \r
- \r
- }\r
-\r
- enum LockType {NONE,X,Y,Z,XY,YZ,XZ,CUSTOM};\r
- LockType lock = LockType.NONE;\r
- \r
- private void setLockType(LockType type, boolean force) {\r
- if (force || lock != LockType.CUSTOM) {\r
- lock = type;\r
- }\r
- xAxisAction.setChecked(false);\r
- yAxisAction.setChecked(false);\r
- zAxisAction.setChecked(false);\r
- xPlaneAction.setChecked(false);\r
- yPlaneAction.setChecked(false);\r
- zPlaneAction.setChecked(false);\r
- xAxisAction.setEnabled(true);\r
- yAxisAction.setEnabled(true);\r
- zAxisAction.setEnabled(true);\r
- xPlaneAction.setEnabled(true);\r
- yPlaneAction.setEnabled(true);\r
- zPlaneAction.setEnabled(true);\r
- switch (lock) {\r
- case X:\r
- xAxisAction.setChecked(true);\r
- break;\r
- case Y:\r
- yAxisAction.setChecked(true);\r
- break;\r
- case Z:\r
- zAxisAction.setChecked(true);\r
- break; \r
- case XY:\r
- zPlaneAction.setChecked(true);\r
- break; \r
- case XZ:\r
- yPlaneAction.setChecked(true);\r
- break; \r
- case YZ:\r
- xPlaneAction.setChecked(true);\r
- break; \r
- case CUSTOM:\r
- xAxisAction.setEnabled(false);\r
- yAxisAction.setEnabled(false);\r
- zAxisAction.setEnabled(false);\r
- xPlaneAction.setEnabled(false);\r
- yPlaneAction.setEnabled(false);\r
- zPlaneAction.setEnabled(false);\r
- break;\r
- }\r
- }\r
- \r
- private double BRANCH_SNAP_DISTANCE = 0.05;\r
- private double NOZZLE_SNAP_DISTANCE = 0.05;\r
- \r
- private double istep = 10.0;\r
- private int decimals = 2;\r
- \r
- private double pipeDiameter = 0.2;\r
- private double elbowRadius = 0.5;\r
- private double eps = 0.001;\r
- \r
- private ArrayList<Point3d> controlPoints = new ArrayList<Point3d>();\r
-\r
- private Point3d currentPoint = new Point3d();\r
- private Point3d lastPoint = new Point3d();\r
- \r
- private Vector3d customLockDir = null;\r
- \r
- private Line selectionLine;\r
- private List<Line> pipeShapes = new ArrayList<Line>();\r
- private MaterialState ms;\r
- \r
- \r
- private Resource selectedPort = null;\r
- private PositionType selectedType = null;\r
- private Resource beginComponentResource = null;\r
- \r
- private Resource endComponentResource = null;\r
- private Resource endComponentPort = null;\r
- private PositionType endPortType = null;\r
- \r
- private Resource highlightedResource = null;\r
- \r
- private boolean useCamera = false;\r
- \r
- private List<Pair<Resource, PositionType>> positions = null;\r
- \r
- private SelectSplitPointAction splitPointAction;\r
- private PositionSelectionGizmo gizmo = null;\r
- \r
- \r
- \r
- private enum ToolState{NOT_ACTIVE, INITIALIZING, SELECTING_POSITION, SELECTING_SPLIT, ROUTING};\r
- private ToolState state = ToolState.NOT_ACTIVE;\r
- \r
- @Override\r
- public void activate() {\r
- state = ToolState.INITIALIZING;\r
- controlPoints.clear();\r
- if (beginComponentResource == null) {\r
- List<IGraphicsNode> mos = parent.getSelectionAdapter().getSelectedObjects();\r
- if (mos.size() != 1) {\r
- end();\r
- return;\r
- }\r
- beginComponentResource = mos.get(0).getResource();\r
- }\r
- parent.getSession().asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- positions = checkStartNode(g,beginComponentResource);\r
- if (positions.size() == 0) {\r
- positions = null;\r
- end();\r
- } else {\r
- state = ToolState.SELECTING_POSITION;\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- if (ms == null) {\r
- ms = parent.getRenderingComponent().getDisplaySystem().getRenderer().createMaterialState();\r
- ms.setEmissive(new ColorRGBA(1.f,1.f,1.f,1.f));\r
- }\r
-\r
- }\r
- \r
- \r
-\r
- @Override\r
- public void deactivate() {\r
- for (Line l : pipeShapes)\r
- l.removeFromParent();\r
- pipeShapes.clear();\r
- if (selectionLine != null)\r
- selectionLine.removeFromParent();\r
- selectionLine = null;\r
- customLockDir = null;\r
- \r
- setLockType(LockType.NONE,true);\r
- beginComponentResource = null;\r
- endComponentResource = null;\r
- detector.clearConstraintHighlights(); \r
- state = ToolState.NOT_ACTIVE;\r
- selectedPort = null;\r
- selectedType = null;\r
- \r
- }\r
- \r
- private List<Pair<Resource, PositionType>> checkStartNode(Graph g, Resource resource) {\r
- List<Pair<Resource, PositionType>> positions = new ArrayList<Pair<Resource,PositionType>>();\r
- \r
- IEntity beginComponent = EntityFactory.create(g, resource);\r
- \r
- if (beginComponent.isInstanceOf(ProcessResource.plant3Dresource.Nozzle)) {\r
- if (PipingTools2.isFreeNozzle(beginComponent)) {\r
-\r
- positions.add(new Pair<Resource, PositionType>(beginComponent.getSingleRelatedObject(ProcessResource.plant3Dresource.HasControlPoint).getResource(),PositionType.NEXT));\r
- } \r
- } else if (beginComponent.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthInlineComponent)) {\r
- // variable length inline component is exception from other pipeline components,\r
- // since a new pipe can branch it\r
- VariableLengthInlineComponent vlic = new VariableLengthInlineComponent(beginComponent);\r
- PipeControlPoint pcp = vlic.getControlPoint();\r
- if (pcp.getNext() == null) {\r
-\r
- positions.add(new Pair<Resource, PositionType>(pcp.getResource(),PositionType.NEXT)); \r
- } else if (pcp.getPrevious() == null) {\r
-\r
- positions.add(new Pair<Resource, PositionType>(pcp.getResource(),PositionType.PREVIOUS));\r
- }\r
- positions.add(new Pair<Resource, PositionType>(pcp.getResource(),PositionType.SPLIT));\r
- } else if (beginComponent.isInstanceOf(ProcessResource.plant3Dresource.EndComponent)) {\r
- PipelineComponent component = new PipelineComponent(beginComponent); \r
- PipeControlPoint pcp = component.getControlPoint();\r
- if (pcp.getNext() == null && pcp.getPrevious() == null) { \r
- throw new RuntimeException("End component " + beginComponent.getResource() + " is not connected to anything.");\r
- //positions.add(new Pair<Resource, PositionType>(pcp.getResource(),PositionType.NEXT));\r
- }\r
- for (PipeControlPoint p : pcp.getSubPoint()) {\r
- if (p.getNext() == null && p.getPrevious() == null) {\r
- positions.add(new Pair<Resource, PositionType>(p.getResource(),PositionType.NEXT));\r
- }\r
- }\r
- } else if (beginComponent.isInstanceOf(ProcessResource.plant3Dresource.PipelineComponent)) {\r
- \r
- PipelineComponent component = new PipelineComponent(beginComponent);\r
- \r
- PipeControlPoint pcp = component.getControlPoint();\r
- if (pcp.getNext() == null) {\r
- positions.add(new Pair<Resource, PositionType>(pcp.getResource(),PositionType.NEXT));\r
- } else if (pcp.getPrevious() == null) {\r
- positions.add(new Pair<Resource, PositionType>(pcp.getResource(),PositionType.PREVIOUS));\r
- }\r
- if (!beginComponent.isInstanceOf(ProcessResource.plant3Dresource.SizeChangeComponent)||\r
- !beginComponent.isInstanceOf(ProcessResource.plant3Dresource.OffsetComponent)) {\r
- for (PipeControlPoint p : pcp.getSubPoint()) {\r
- if (p.getNext() == null && p.getPrevious() == null) {\r
- positions.add(new Pair<Resource, PositionType>(p.getResource(),PositionType.NEXT));\r
- }\r
- }\r
- } \r
- } else {\r
- return positions;\r
- }\r
- return positions;\r
- }\r
-\r
- @Override\r
- public void update() {\r
- \r
- switch (state) {\r
- case NOT_ACTIVE:\r
- return; // TODO : throw Exception?\r
- case INITIALIZING:\r
- return;\r
- case SELECTING_POSITION:\r
- updateSelectPosition();\r
- break;\r
- case SELECTING_SPLIT:\r
- updateSelectSplit();\r
- break;\r
- case ROUTING:\r
- updateRouting();\r
- break;\r
- }\r
- return;\r
- }\r
-\r
- private void updateSelectPosition() {\r
- \r
- if (positions == null) {\r
- throw new RuntimeException("positions must be loaded before select position can be activated");\r
- }\r
- if (selectedPort != null) {\r
- throw new RuntimeException("position is already selected");\r
- }\r
- if (positions.size() == 1) {\r
- selectedPort = positions.get(0).first;\r
- selectedType = positions.get(0).second;\r
- state = ToolState.INITIALIZING;\r
- \r
- \r
- \r
- if (requiresNewPipeRun()){\r
- if(!getNewPipeRunSpecs()) {\r
- end();\r
- return;\r
- }\r
- }\r
- if (selectedType == PositionType.SPLIT) {\r
- startSplitting();\r
- } else {\r
- startRouting();\r
- }\r
-\r
- } else if (gizmo == null) {\r
- state = ToolState.INITIALIZING; // asyncRead!\r
- parent.getSession().asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- List<Pair<Point3d, PositionType>> pos = new ArrayList<Pair<Point3d,PositionType>>();\r
- for (Pair<Resource, PositionType> p : positions) {\r
- IEntity entity = EntityFactory.create(g,p.first);\r
- Point3d position = ControlPointTools.getRealPosition(entity, p.second);\r
- pos.add(new Pair<Point3d, PositionType>(position,p.second));\r
- }\r
- gizmo = new PositionSelectionGizmo(parent, pos);\r
- parent.setGizmo(gizmo);\r
- parent.getRenderingComponent().getNoShadowRoot().attachChild(gizmo.getNode());\r
- state = ToolState.SELECTING_POSITION;\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- } else {\r
- gizmo.update();\r
- \r
- if (input.keyPressed(KeyEvent.VK_ESCAPE)) {\r
- state = ToolState.INITIALIZING;\r
- parent.setGizmo(null);\r
- gizmo = null;\r
- end();\r
- return;\r
- }\r
-\r
- if (gizmo.getSelected() >= 0 && input.mouseClicked() && input.clickButton() == MouseEvent.BUTTON1) {\r
- state = ToolState.INITIALIZING; // asyncRead!\r
- parent.setGizmo(null);\r
- selectedPort = positions.get(gizmo.getSelected()).first;\r
- selectedType = positions.get(gizmo.getSelected()).second;\r
- gizmo = null;\r
- \r
- if (selectedType == PositionType.SPLIT) {\r
- startSplitting(); \r
- return;\r
- } else {\r
- startRouting();\r
- }\r
- } \r
- \r
- if (useCamera) {\r
- parent.getDefaultAction().update();\r
- return;\r
- }\r
- }\r
- \r
- }\r
- \r
- private boolean requiresNewPipeRun() {\r
- GraphRequestWithResult<Boolean> createsNewPipeline = new GraphRequestWithResult<Boolean>() {\r
- @Override\r
- public Boolean performWithResult(Graph g) throws Exception {\r
- if(g.isInstanceOf(selectedPort, ProcessResource.plant3Dresource.NozzleControlPoint))\r
- return true;\r
- if (selectedType == PositionType.SPLIT)\r
- return true;\r
- return false;\r
- \r
- }\r
- };\r
- parent.getSession().syncRead(createsNewPipeline);\r
- return createsNewPipeline.getResult();\r
- }\r
- \r
- private boolean getNewPipeRunSpecs() {\r
- PipelineDialog dialog;\r
- dialog = new PipelineDialog(parent.getRenderingComposite().getShell(),pipeDiameter,elbowRadius);\r
- if (dialog.open() == PipelineDialog.CANCEL) {\r
- end();\r
- return false;\r
- }\r
- pipeDiameter = dialog.getPipeDiameter();\r
- elbowRadius = dialog.getTurnRadius();\r
- return true;\r
- }\r
- \r
- private void startRouting() {\r
- state = ToolState.INITIALIZING;\r
- parent.getSession().asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- PipeControlPoint pcp = new PipeControlPoint(g,selectedPort);\r
- lastPoint = ControlPointTools.getRealPosition(pcp, selectedType);//G3DTools.getPoint(pcp.getWorldPosition());\r
- if (pcp.isInstanceOf(ProcessResource.plant3Dresource.DirectedControlPoint)) {\r
- lock = LockType.CUSTOM;\r
- customLockDir = ControlPointTools.getDirectedControlPointDirection(pcp);\r
- } else if (pcp.isInstanceOf(ProcessResource.plant3Dresource.FixedLengthControlPoint)||\r
- pcp.isInstanceOf(ProcessResource.plant3Dresource.TurnControlPoint)) {\r
- lock = LockType.CUSTOM;\r
- if (selectedType == PositionType.NEXT)\r
- customLockDir = ControlPointTools.getPathLegDirection(pcp, Direction.NEXT);\r
- else\r
- customLockDir = ControlPointTools.getPathLegDirection(pcp, Direction.PREVIOUS);\r
- } else {\r
- lock = LockType.NONE;\r
- }\r
- IEntity pipeRun = ControlPointTools.getPipeRun(pcp);\r
- if (pipeRun != null) {\r
- pipeDiameter = pipeRun.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasPipeDiameter);\r
- elbowRadius = pipeRun.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasTurnRadius);\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- @Override\r
- public void requestCompleted(GraphRequestStatus status) {\r
- createLine();\r
- state = ToolState.ROUTING;\r
- }\r
- });\r
- }\r
- \r
- private void startSplitting() {\r
- parent.getSession().asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- PipeControlPoint pcp = new PipeControlPoint(g,selectedPort);\r
- Point3d p1 = new Point3d();\r
- Point3d p2 = new Point3d();\r
- ControlPointTools.getInlineControlPointEnds(pcp, p1, p2);\r
- splitPointAction.setSplit(p1, p2);\r
- splitPointAction.activate();\r
- state = ToolState.SELECTING_SPLIT;\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- }); \r
- }\r
- \r
- \r
- private void updateSelectSplit() {\r
- if (splitPointAction.active()) {\r
- splitPointAction.update();\r
- return;\r
- } else {\r
- throw new RuntimeException("SplitPointAction should be active");\r
- }\r
- }\r
- \r
- @Override\r
- public void setSplitPoint(Point3d point) {\r
- splitPointAction.deactivate();\r
- if (point == null) {\r
- end();\r
- return;\r
- } else {\r
- \r
- \r
- lastPoint = point;\r
- createLine();\r
- state = ToolState.ROUTING;\r
- }\r
- }\r
- \r
- private void updateRouting() {\r
- if(input.keyPressed(KeyEvent.VK_ESCAPE)) {\r
- controlPoints.clear();\r
- end();\r
- return;\r
- }\r
- if (input.keyPressed(KeyEvent.VK_C)) {\r
- useCamera = !useCamera;\r
- cameraAction.setChecked(useCamera);\r
- }\r
- if (useCamera) {\r
- parent.getDefaultAction().update();\r
- return;\r
- }\r
- \r
- parent.getSession().syncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- \r
- Vector3d o = new Vector3d();\r
- Vector3d d = new Vector3d();\r
- parent.createPickRay(o, d);\r
- if (!updateCurrentPoint(o, d))\r
- return GraphRequestStatus.transactionComplete();\r
- //Point3d startPoint = new Point3d();\r
- double mu[] = new double[2];\r
- \r
- IEntity endTo = null;\r
- PositionType endType = null;\r
- IEntity endPort = null;\r
- \r
- if (parent.getSelectionAdapter().getHighlightSelection().size() > 0) {\r
- highlightedResource = parent.getSelectionAdapter().getHighlightSelection().getSelectionList().get(0);\r
- } else {\r
- highlightedResource = null;\r
- }\r
-\r
- if (highlightedResource != null) {\r
- IEntity highlightNode = EntityFactory.create(g,highlightedResource);\r
- \r
- if (lock == LockType.NONE) {\r
- if (highlightNode.isInstanceOf(ProcessResource.plant3Dresource.Nozzle) && endingToNozzle(highlightNode,o,d)) {\r
- endTo = highlightNode;\r
- } else if (highlightNode.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthInlineComponent)) {\r
- endTo = highlightNode;\r
- endType = endingToStraight(new VariableLengthInlineComponent(highlightNode),mu,o,d); \r
- } else if (highlightNode.isInstanceOf(ProcessResource.plant3Dresource.PipelineComponent) && (endPort = endingToComponent(highlightNode,o,d)) != null) {\r
- endTo = highlightNode;\r
- } else {\r
- updateRoute(o,d); \r
- }\r
- } else { \r
- if (highlightNode.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthInlineComponent) && (endType = endingLockToStraight(new VariableLengthInlineComponent(highlightNode),mu)) != null) {\r
- endTo = highlightNode;\r
- } else if (highlightNode.isInstanceOf(ProcessResource.plant3Dresource.Nozzle) && endingLockToNozzle(highlightNode)) {\r
- endTo = highlightNode;\r
- } else if (highlightNode.isInstanceOf(ProcessResource.plant3Dresource.PipelineComponent) && (endPort = endingLockToComponent(highlightNode)) != null) {\r
- endTo = highlightNode;\r
- } else {\r
- updateRoute(o,d);\r
- }\r
- }\r
- \r
- \r
- } else {\r
- updateRoute(o,d);\r
- }\r
- \r
- parent.setViewChanged(true);\r
- if (input.mouseClicked()) {\r
- if (input.clickButton() == MouseEvent.BUTTON1) {\r
- if (controlPoints.size() > 0) {\r
- addPoint();\r
- setLockType(LockType.NONE,true);\r
- if (endTo != null) {\r
- endComponentResource = endTo.getResource();\r
- if (endPort != null)\r
- endComponentPort = endPort.getResource();\r
- endPortType = endType;\r
- \r
- endPiping();\r
- }\r
- } else {\r
- throw new RuntimeException("kjf");\r
-// // user was selecting position of branch\r
-// lastPoint.set(startPoint);\r
-// controlPoints.add(new Point3d(startPoint));\r
-// if (selectionLine != null)\r
-// selectionLine.removeFromParent();\r
-// selectionLine = null;\r
- }\r
- } else if (input.clickButton() == MouseEvent.BUTTON2){\r
- detector.updateConstraintReference();\r
- } else if (input.clickButton() == MouseEvent.BUTTON3){ \r
- endPiping();\r
- }\r
- }\r
- \r
- return GraphRequestStatus.transactionComplete();\r
- } \r
- });\r
- \r
- }\r
- \r
- private void createLine() {\r
- controlPoints.add(new Point3d(lastPoint));\r
- Line line = new Line();\r
- line.setRenderState(ms);\r
- \r
- PipeComponentProvider.createStraightEdges(line, currentPoint, currentPoint, pipeDiameter*0.5);\r
- pipeShapes.add(line);\r
- parent.getRenderingComponent().getNoShadowRoot().attachChild(line); \r
- line.setCullMode(Geometry.CULL_NEVER);\r
- }\r
- \r
- \r
- /**\r
- * Adds current point to pipeline\r
- *\r
- */\r
- private void addPoint() {\r
- \r
- controlPoints.add(new Point3d(currentPoint));\r
- Line line = new Line();\r
- line.setRenderState(ms);\r
- PipeComponentProvider.createStraightEdges(line, controlPoints.get(controlPoints.size() - 1), currentPoint, pipeDiameter*0.5);\r
- pipeShapes.add(line);\r
- parent.getRenderingComponent().getNoShadowRoot().attachChild(line); \r
- line.setCullMode(Geometry.CULL_NEVER);\r
- lastPoint.set(currentPoint);\r
- }\r
- \r
- /**\r
- * Updates tool graphics for current point \r
- */\r
- private void updateCurrentPoint() {\r
- PipeComponentProvider.createStraightEdges(pipeShapes.get(pipeShapes.size() - 1), controlPoints.get(controlPoints.size() - 1), currentPoint, pipeDiameter*0.5);\r
- }\r
- \r
- /**\r
- * Removes last point from pipeline\r
- */\r
- public void removePoint() {\r
- if (controlPoints.size() < 2)\r
- return;\r
- controlPoints.remove(controlPoints.size() - 1);\r
-\r
- pipeShapes.get(pipeShapes.size() - 1).removeFromParent();\r
- pipeShapes.remove(pipeShapes.size() - 1);\r
- PipeComponentProvider.createStraightEdges(pipeShapes.get(pipeShapes.size() - 1), controlPoints.get(controlPoints.size() - 1), currentPoint, pipeDiameter*0.5);\r
- \r
- lastPoint.set(controlPoints.get(controlPoints.size()-1));\r
- if (controlPoints.size() < 2 && customLockDir != null) {\r
- setLockType(LockType.CUSTOM, true);\r
- }\r
- }\r
- \r
- \r
- \r
- private boolean endingToNozzle(IEntity nozzle,Vector3d o, Vector3d d) { \r
- IEntity pcp = nozzle.getSingleRelatedObject(ProcessResource.plant3Dresource.HasControlPoint);\r
- if (pcp != null && (pcp.getAtMostOneRelatedObject(ProcessResource.plant3Dresource.HasNext) != null ||\r
- pcp.getAtMostOneRelatedObject(ProcessResource.plant3Dresource.HasPrevious) != null))\r
- return false; // nozzle is already connected to pipe\r
- currentPoint = G3DTools.getPoint(nozzle.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition));\r
- Point3d previousPipePoint = controlPoints.get(controlPoints.size() - 1);\r
- Point3d p = detector.getSnappedPoint(o, d, new Vector3d(previousPipePoint));\r
- if (p != null) {\r
- if (p.distance(currentPoint) > NOZZLE_SNAP_DISTANCE) {\r
- return false;\r
- }\r
- } \r
- \r
- updateCurrentPoint();\r
- \r
- setInfoText("Connect to nozzle " + currentPoint);\r
- return true;\r
- \r
- }\r
- \r
- private PositionType endingToStraight(VariableLengthInlineComponent s, double mu[], Vector3d o, Vector3d d) {\r
- String info = "";\r
- Point3d sStart = new Point3d();\r
- Point3d sEnd = new Point3d();\r
- //detector.clearConstraintHighlights();\r
- \r
- Point3d previousPipePoint = controlPoints.get(controlPoints.size() - 1);\r
- //String st = "";\r
- if (lock == LockType.NONE) {\r
- Point3d p = detector.getSnappedPoint(o, d, new Vector3d(previousPipePoint));\r
- if (p != null) {\r
- currentPoint = p;\r
- // snapping is detected, check if snapped point can create branch with straight\r
- PositionType t = endingLockToStraight(s, mu);\r
- if (t != null)\r
- return t;\r
- // if not, we'll have to remove highlight that was added when snapped point was detected\r
- detector.clearConstraintHighlights();\r
- } \r
- \r
- PipingTools2.getInlineComponentEnds(s, sStart, sEnd);\r
- Vector3d sDir = new Vector3d(sEnd);\r
- sDir.sub(sStart);\r
- MathTools.intersectStraightStraight(sStart, sDir, o, d, currentPoint, new Point3d(), mu);\r
- \r
-\r
- } else {\r
- throw new RuntimeException("Lock shouldn't be on");\r
-\r
- }\r
- \r
- updateCurrentPoint();\r
- \r
- // branch point must lie between straight's ends. If connection point is exactly\r
- // on straight end user may want to connect pipes to each other\r
- // TODO : take account sizes of inline components)\r
- // TODO : actually make connection if its detected\r
- boolean connectPrev = false;\r
- boolean connectNext = false;\r
- \r
- if (mu[0] < 0.0) {\r
- currentPoint.set(sStart);\r
- connectPrev = true;\r
- }\r
- else if (mu[0] > 1.0) {\r
- currentPoint.set(sEnd);\r
- connectNext = true;\r
- }\r
- boolean connect = false;\r
- if (connectPrev) {\r
- PipeControlPoint pcp = s.getControlPoint();\r
- if (pcp.getPrevious() == null)\r
- connect = true;\r
- } else if (connectNext) {\r
- PipeControlPoint pcp = s.getControlPoint();\r
- if (pcp.getNext() == null)\r
- connect = true;\r
- }\r
- \r
- updateCurrentPoint();\r
- \r
- if (connect)\r
- info += "Connect pipes :";\r
- else\r
- info += "Make Branch :";\r
- \r
- setInfoText(info + currentPoint + " " + Math.max(0.0, Math.min(mu[0], 1.0)));\r
- if (connect) {\r
- if (connectNext) {\r
- return PositionType.NEXT;\r
- } else {\r
- return PositionType.PREVIOUS;\r
- }\r
- \r
- }\r
- return PositionType.SPLIT;\r
- \r
- }\r
- \r
- private IEntity endingToComponent(IEntity component, Vector3d o, Vector3d d) {\r
- // TODO : scan all empty pcps of the component and select closest one.\r
- return null;\r
- }\r
- \r
- private PositionType endingLockToStraight(VariableLengthInlineComponent s, double mu[]) {\r
- \r
- Point3d sStart = new Point3d();//G3DTools.getPoint(s.getHasControlPoint().getPreviousPoint().getLocalPosition());\r
- Point3d sEnd = new Point3d(); //G3DTools.getPoint(s.getHasControlPoint().getNextPoint().getLocalPosition());\r
- PipingTools2.getInlineComponentEnds(s, sStart, sEnd);\r
- Vector3d sDir = new Vector3d(sEnd);\r
- sDir.sub(sStart);\r
- Vector3d dir = new Vector3d(currentPoint);\r
- Point3d prev = controlPoints.get(controlPoints.size() - 1);\r
- dir.sub(prev);\r
- // intersection point in pipe where branch would be inserted to\r
- Vector3d branchPoint = new Vector3d();\r
- // intersection point in straight pipe that is currently routed\r
- Vector3d routePoint = new Vector3d();\r
- MathTools.intersectStraightStraight(sStart, sDir, new Vector3d(prev), dir, branchPoint, routePoint, mu);\r
- routePoint.sub(branchPoint);\r
- // startPoint of branch must be between pipe ends\r
- // TODO : take account sizes of elbows (or other components)\r
- // branch point must be between pipe ends and intersection points must be quite close to each othert\r
- if (mu[0] > 0.0 && mu[0] < 1.0 && routePoint.lengthSquared() < BRANCH_SNAP_DISTANCE) {\r
- currentPoint.set(branchPoint);\r
- \r
- updateCurrentPoint();\r
- \r
- setInfoText("Make branch (l) :" + currentPoint + " " + Math.max(0.0, Math.min(mu[0], 1.0)) + " " + routePoint.lengthSquared());\r
- return PositionType.SPLIT;\r
- }\r
- return null;\r
- }\r
- \r
- private boolean endingLockToNozzle(IEntity nozzle) {\r
- Vector3d dir = new Vector3d(currentPoint);\r
- Point3d prev = controlPoints.get(controlPoints.size() - 1);\r
- dir.sub(prev);\r
- Point3d nozzleLoc = G3DTools.getPoint(nozzle.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition));\r
- double u[] = new double[1];\r
- Vector3d closest = MathTools.closestPointOnStraight(new Point3d(nozzleLoc), new Point3d(prev), new Vector3d(dir), u);\r
- double dist = nozzleLoc.distanceSquared(new Point3d(closest));\r
- if (dist < BRANCH_SNAP_DISTANCE) {\r
- // FIXME : directions should be checked (insert an elbow)\r
- currentPoint.set(nozzleLoc);\r
- updateCurrentPoint();\r
- setInfoText("Connect to nozzle (l) :" + currentPoint);\r
- return true;\r
- } \r
- //System.out.println(u[0]);\r
- return false;\r
- }\r
- \r
- private IEntity endingLockToComponent(IEntity component) {\r
- // we'll must scan all free pcp's and their direction to accept the connection.\r
- return null;\r
- }\r
- \r
- private void updateRoute(Vector3d o, Vector3d d) {\r
- detector.clearConstraintHighlights();\r
- Point3d previousPipePoint = controlPoints.get(controlPoints.size() - 1);\r
- String s = "";\r
- if (lock == LockType.NONE) {\r
- Point3d p = detector.getSnappedPoint(o, d, new Vector3d(previousPipePoint));\r
- if (p != null)\r
- currentPoint = p;\r
- s += detector.getSnapString();\r
-\r
- } else {\r
- Vector3d dir = new Vector3d(currentPoint);\r
- dir.sub(previousPipePoint);\r
- Point3d p = detector.getPointSnap(new Vector3d(previousPipePoint), dir);\r
- if (p != null)\r
- currentPoint = p;\r
- s += detector.getSnapString();\r
-\r
- }\r
- \r
- updateCurrentPoint();\r
- s += currentPoint.toString();\r
- setInfoText(s);\r
- }\r
- \r
- private boolean updateCurrentPoint(Vector3d o, Vector3d d) {\r
- if (lock != LockType.CUSTOM) {\r
- if (input.keyPressed(KeyEvent.VK_X)) {\r
- if (lock == LockType.X)\r
- setLockType(LockType.YZ,false);\r
- else\r
- setLockType(LockType.X,false);\r
- }\r
- if (input.keyPressed(KeyEvent.VK_Y)) {\r
- if (lock == LockType.Y)\r
- setLockType(LockType.XZ,false);\r
- else\r
- setLockType(LockType.Y,false);\r
- }\r
- if (input.keyPressed(KeyEvent.VK_Z)) {\r
- if (lock == LockType.Z)\r
- setLockType(LockType.XY,false);\r
- else\r
- setLockType(LockType.Z,false);\r
- }\r
- if (input.keyPressed(KeyEvent.VK_N)) {\r
- setLockType(LockType.NONE,false);\r
- }\r
- if (input.keyPressed(KeyEvent.VK_BACK_SPACE)) {\r
- removePoint();\r
- }\r
- }\r
- Vector3d point = new Vector3d(lastPoint);\r
- boolean step = ((input.moveModifiers() & MouseEvent.CTRL_DOWN_MASK) > 0);\r
- switch(lock) {\r
- case X:\r
- MathTools.intersectStraightStraight(point, new Vector3d(1.0,0.0,0.0), o,d, currentPoint, new Vector3d());\r
- if (step) {\r
- currentPoint.x = Math.round(istep * currentPoint.x) / istep;\r
- BigDecimal bx = new BigDecimal(currentPoint.x);\r
- bx.setScale(decimals, BigDecimal.ROUND_HALF_UP);\r
- currentPoint.x = bx.doubleValue();\r
- }\r
- break;\r
- case Y:\r
- MathTools.intersectStraightStraight(point, new Vector3d(0.0,1.0,0.0), o,d, currentPoint, new Vector3d());\r
- if (step) {\r
- currentPoint.y = Math.round(istep * currentPoint.y) / istep;\r
- BigDecimal bx = new BigDecimal(currentPoint.y);\r
- bx.setScale(decimals, BigDecimal.ROUND_HALF_UP);\r
- currentPoint.y = bx.doubleValue();\r
- }\r
- break;\r
- case Z:\r
- MathTools.intersectStraightStraight(point, new Vector3d(0.0,0.0,1.0), o,d, currentPoint, new Vector3d());\r
- if (step) {\r
- currentPoint.z = Math.round(istep * currentPoint.z) / istep;\r
- BigDecimal bx = new BigDecimal(currentPoint.z);\r
- bx.setScale(decimals, BigDecimal.ROUND_HALF_UP);\r
- currentPoint.z = bx.doubleValue();\r
- }break;\r
- case XY:\r
- MathTools.intersectStraightPlane(o, d, point, new Vector3d(0.0,0.0,1.0), currentPoint);\r
- break;\r
- case XZ:\r
- MathTools.intersectStraightPlane(o, d, point, new Vector3d(0.0,1.0,0.0), currentPoint);\r
- break;\r
- case YZ:\r
- MathTools.intersectStraightPlane(o, d, point, new Vector3d(1.0,0.0,0.0), currentPoint);\r
- break;\r
- case NONE:\r
- Vector3d normal = parent.getCamera().getUnNormalizedHeading();\r
- normal.normalize();\r
- \r
- MathTools.intersectStraightPlane(o, d, point, normal, currentPoint);\r
- break;\r
- case CUSTOM:\r
- MathTools.intersectStraightStraight(point, new Vector3d(customLockDir), o,d, currentPoint, new Vector3d());\r
- double dist = MathTools.distanceFromPlane(new Vector3d(currentPoint), customLockDir, lastPoint);\r
- if (dist < 0.0)\r
- currentPoint.set(lastPoint);\r
- break;\r
- default:\r
- return false;\r
- }\r
- return true;\r
- }\r
- \r
- \r
- private ArrayList<Point3d> filterPoints() {\r
- ArrayList<Point3d> filteredControlPoints = new ArrayList<Point3d>();\r
- \r
- // this loop filters control points that are not needed\r
- for (int i = 0; i < controlPoints.size() - 2; i++) {\r
- Point3d start = controlPoints.get(i);\r
- if (i == 0)\r
- filteredControlPoints.add(start);\r
- \r
- Point3d middle = controlPoints.get(i+1);\r
- Point3d end = controlPoints.get(i+2);\r
- \r
- Vector3d dir1 = new Vector3d(middle);\r
- dir1.sub(start);\r
- Vector3d dir2 = new Vector3d(end);\r
- dir2.sub(middle);\r
- double angle = dir1.angle(dir2);\r
- if (angle > eps && angle < (Math.PI - eps))\r
- filteredControlPoints.add(middle);\r
- // if angle is near PI pipe turns back to where it started\r
- // if angle is near zero, pipe is straight and there's no need for control point\r
- \r
- if (i == controlPoints.size() - 3)\r
- filteredControlPoints.add(end);\r
- \r
- } \r
- return filteredControlPoints;\r
- }\r
- \r
- private PipeControlPoint connectPipeStart(Graph graph, PipeRun pipeRun, boolean reversed) {\r
- PipeControlPoint pcp = new PipeControlPoint(graph,selectedPort);\r
- IEntity beginComponent = EntityFactory.create(graph,beginComponentResource);\r
- if (beginComponent.isInstanceOf(ProcessResource.plant3Dresource.Nozzle)) {\r
- PipingTools2.linkNozzleAndPipeRun(beginComponent, pipeRun);\r
- // TODO : set diameters same\r
- //reversed = false;\r
- \r
- } else if (beginComponent.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthInlineComponent)) {\r
- switch (selectedType) {\r
- case NEXT:\r
- {\r
- PipeControlPoint tcp = createTurn(graph, pipeRun, 0);\r
- connectControlPoints(pcp, tcp, reversed);\r
- return tcp;\r
- }\r
- case PREVIOUS:\r
- {\r
- PipeControlPoint tcp = createTurn(graph, pipeRun, 0);\r
- connectControlPoints(pcp, tcp, reversed);\r
- return tcp;\r
- }\r
- case SPLIT:\r
- //reversed = false;\r
- // 1. create (non visible) splitting component.\r
- PipelineComponent newComponent = PipingTools2.instantiatePipelineComponent(graph, PipingTools2.getPipeRun(beginComponent).getResource(), ProcessResource.plant3Dresource.BranchSplitComponent); \r
- PipeControlPoint mainCP = newComponent.getControlPoint();\r
- // 2. create control point for the branch\r
- BranchEndControlPoint becp = BranchEndControlPoint.createDefault(graph);\r
- mainCP.addSubPoint(becp);\r
- pipeRun.addControlPoints(becp);\r
- pcp = becp.toPipeControlPoint();\r
- ControlPointTools.setWorldPosition(mainCP, controlPoints.get(0));\r
- \r
- PipingTools2.splitVariableLengthComponent(newComponent, beginComponent);\r
- }\r
- } else if (beginComponent.isInstanceOf(ProcessResource.plant3Dresource.PipelineComponent)) {\r
- //if (selectedType == PositionType.PREVIOUS)\r
- //reversed = true;\r
- //else\r
- //reversed = false;\r
- } else {\r
- throw new RuntimeException("unknown starting component");\r
- }\r
- \r
- return pcp;\r
- }\r
- \r
- private PipeControlPoint connectPipeEnd(Graph graph, PipeRun pipeline, boolean reversed) {\r
- PipeControlPoint pcp = null;\r
- IEntity endComponent = null;\r
- if (endComponentResource != null)\r
- endComponent = EntityFactory.create(graph, endComponentResource);\r
- if (endComponent == null) {\r
- return null;\r
- } else if (endComponent.isInstanceOf(ProcessResource.plant3Dresource.Nozzle)){\r
- pcp = new PipeControlPoint(endComponent.getSingleRelatedObject(ProcessResource.plant3Dresource.HasControlPoint));\r
- PipingTools2.linkNozzleAndPipeRun(endComponent, pipeline);\r
- } else if (endComponent.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthInlineComponent)) {\r
- assert(endPortType != null);\r
- if (endPortType == PositionType.SPLIT) {\r
- //System.out.println(lastPoint + " " + currentPoint + " " + positions.get(positions.size() - 1));\r
- Point3d pos = lastPoint;\r
- // 1. create (non visible) splitting component.\r
- PipelineComponent newComponent = PipingTools2.instantiatePipelineComponent(graph, PipingTools2.getPipeRun(endComponent).getResource(), ProcessResource.plant3Dresource.BranchSplitComponent);\r
- \r
- PipeControlPoint mainCP = newComponent.getControlPoint();\r
- // 2. create control point for the branch\r
- BranchEndControlPoint becp = BranchEndControlPoint.createDefault(graph);\r
- mainCP.addSubPoint(becp);\r
- pipeline.addControlPoints(becp);\r
- pcp = becp.toPipeControlPoint();\r
- ControlPointTools.setWorldPosition(mainCP, pos);\r
- \r
- PipingTools2.splitVariableLengthComponent(newComponent, endComponent);\r
- } else {\r
- \r
- } \r
- } else if (endComponent.isInstanceOf(ProcessResource.plant3Dresource.FixedLengthInlineComponent)) {\r
- // attach to selected port, reverse the piperun if needed\r
- pcp = new PipeControlPoint(graph,endComponentPort);\r
- if (!reversed && pcp.getPrevious() != null || reversed && pcp.getNext() != null) {\r
- PipingTools2.reversePipeRun(ControlPointTools.getPipeRun(pcp));\r
- }\r
- }\r
- return pcp;\r
- }\r
- \r
- private PipeControlPoint createTurn(Graph coreTC,PipeRun pipeRun, int i) {\r
- PipelineComponent elbow = PipingTools2.instantiatePipelineComponent(coreTC,pipeRun.getResource(), ProcessResource.plant3Dresource.Elbow);\r
- G3DAPI.setWorldPosition(elbow, controlPoints.get(i));\r
- return elbow.getControlPoint();\r
- }\r
- \r
- private PipeControlPoint createInline(Graph graph, PipeRun pipeRun, int i) {\r
- Point3d p1 = controlPoints.get(i-1);\r
- Point3d p2 = controlPoints.get(i);\r
- Vector3d v = new Vector3d(p2);\r
- v.sub(p1);\r
- double length = v.length();\r
- v.scale(0.5);\r
- v.add(p1);\r
- PipelineComponent straight = PipingTools2.instantiatePipelineComponent(graph,pipeRun.getResource(), ProcessResource.plant3Dresource.Straight);\r
- G3DAPI.setWorldPosition(straight, v);\r
- straight.setRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength, length);\r
- return straight.getControlPoint();\r
- \r
- }\r
- \r
- private void connectControlPoints(PipeControlPoint previous, PipeControlPoint pcp, boolean reversed) {\r
- if (previous != null) {\r
- PipeControlPoint sccp;\r
- PipeControlPoint ocp;\r
- if (previous.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint)) {\r
- sccp = previous;\r
- ocp = sccp.getSubPoint().iterator().next();\r
- } else if (previous.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint)) {\r
- ocp = previous;\r
- sccp = ocp.getSubPointOf();\r
- } else {\r
- if (!reversed) {\r
- previous.setNext(pcp);\r
- pcp.setPrevious(previous);\r
- } else {\r
- previous.setPrevious(pcp);\r
- pcp.setNext(previous);\r
- }\r
- return;\r
- }\r
- if (!reversed) {\r
- sccp.setNext(pcp);\r
- ocp.setNext(pcp);\r
- pcp.setPrevious(ocp);\r
- } else {\r
- sccp.setPrevious(pcp);\r
- ocp.setPrevious(pcp);\r
- pcp.setNext(sccp);\r
- }\r
- \r
- }\r
- }\r
- \r
- private void endPiping() {\r
- state = ToolState.NOT_ACTIVE;\r
- \r
- if (controlPoints.size() > 2) // if there's only two control points, filtering does nothing\r
- controlPoints = filterPoints();\r
- \r
- if (controlPoints.size() > 1) {\r
- parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph graph) throws Exception {\r
- PipeRun pipeline = null;\r
- boolean reversed;\r
- PipelineComponent beginComponent = new PipelineComponent(graph,beginComponentResource);\r
- if (beginComponent.isInstanceOf(ProcessResource.plant3Dresource.Nozzle) ||\r
- selectedType == PositionType.SPLIT) {\r
-\r
- \r
-// \r
- pipeline = PipeRun.createDefault(graph);\r
- ((ProcessEditor) parent).getPlant(graph).addChild(pipeline);\r
- pipeline.setPipeDiameter(pipeDiameter);\r
- pipeline.setTurnRadius(elbowRadius);\r
- reversed = false;\r
- } else if (beginComponent.isInstanceOf(ProcessResource.plant3Dresource.SizeChangeComponent)||\r
- beginComponent.isInstanceOf(ProcessResource.plant3Dresource.OffsetComponent)){\r
- PipeControlPoint pcp = new PipeControlPoint(graph,selectedPort);\r
- if (selectedType == PositionType.NEXT) {\r
- // get the piperun from offsetpoint\r
- reversed = false;\r
- pipeline = pcp.getSubPoint().iterator().next().getControlPointOfPipeRun();\r
- } else if (selectedType == PositionType.PREVIOUS) {\r
- reversed = true;\r
- pipeline = pcp.getControlPointOfPipeRun();\r
- } else {\r
- throw new RuntimeException("Wrong PsoitionType " + selectedType + " for a SizeChangeComponent");\r
- }\r
- \r
- } else if (beginComponent.isInstanceOf(ProcessResource.plant3Dresource.PipelineComponent)) {\r
- \r
- pipeline = new PipeRun(beginComponent.getParent());\r
- if (selectedType == PositionType.PREVIOUS) {\r
- reversed = true;\r
- } else {\r
- reversed = false;\r
- }\r
- } else {\r
- throw new RuntimeException("Cannot start routing pipe : object not supported!");\r
- }\r
-\r
- PipeControlPoint previous = null;\r
- for (int i = 0; i < controlPoints.size(); i++) {\r
- PipeControlPoint pcp = null;\r
- if (i == 0) {\r
- pcp = connectPipeStart(graph, pipeline,reversed);\r
-\r
- } else {\r
- pcp = createInline(graph, pipeline, i);\r
- connectControlPoints(previous, pcp, reversed);\r
- previous = pcp;\r
- if (i == controlPoints.size() - 1) {\r
- pcp = connectPipeEnd(graph, pipeline, reversed);\r
- } else {\r
- \r
- pcp = createTurn(graph,pipeline,i);\r
- }\r
- }\r
- \r
- if (pcp != null) {\r
- connectControlPoints(previous, pcp, reversed);\r
- //pipeline.addSgetHasControlPointSet().add(pcp);\r
- previous = pcp;\r
- }\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- @Override\r
- public void requestCompleted(GraphRequestStatus status) {\r
- endThreaded();\r
- }\r
- });\r
-\r
- \r
- \r
- } else {\r
- endThreaded(); \r
- }\r
- }\r
- \r
- private void endThreaded() {\r
- parent.getRenderingComposite().getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- end();\r
- }\r
- });\r
- }\r
-\r
- @Override\r
- public void init() {\r
- this.setText("Route pipe");\r
- this.setToolTipText("Starts routing a new pipeline");\r
- this.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/Straight.png"));\r
- }\r
-\r
- @Override\r
- public boolean usable(Graph g, List<Resource> resources) {\r
- if (resources.size() != 1) {\r
- return false;\r
- }\r
- return checkStartNode(g,resources.get(0)).size() > 0;\r
- }\r
- \r
- \r
- \r
- public boolean acceptDrop(StructuredResourceSelection s, Resource[] ids) {\r
- if (s.size() != 1)\r
- return false;\r
- if (ids == null)\r
- return false;\r
- if (ids.length != 1)\r
- return false;\r
- final Resource dropped = ids[0];\r
- final Resource target = s.iterator().next();\r
- GraphRequestWithResult<Boolean> query = new GraphRequestWithResult<Boolean>() {\r
- @Override\r
- public Boolean performWithResult(Graph g) throws Exception {\r
- if(!g.isInstanceOf(dropped, ProcessResource.plant3Dresource.VariableLengthInlineComponent))\r
- return false;\r
- // TODO : check that type is not abstract\r
- List<Resource> list = new ArrayList<Resource>();\r
- list.add(target);\r
- return usable(g, list);\r
- }\r
- };\r
- parent.getSession().syncRead(query);\r
- return query.getResult();\r
- }\r
- \r
- public void doDrop(StructuredResourceSelection s, Resource[] ids) {\r
- beginComponentResource = s.iterator().next(); \r
- parent.setCurrentAction(this);\r
- }\r
- \r
- public void setInfoText(String text) {\r
- \r
- }\r
-\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.actions;\r
-\r
-import java.awt.event.MouseEvent;\r
-import java.util.List;\r
-\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.proconf.g3d.actions.InteractiveAction;\r
-import org.simantics.proconf.g3d.base.MathTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.base.VecmathJmeTools;\r
-\r
-import com.jme.math.Vector3f;\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.scene.Line;\r
-import com.jme.scene.state.MaterialState;\r
-import com.jme.util.geom.BufferUtils;\r
-\r
-public class SelectSplitPointAction extends InteractiveAction {\r
- \r
- Point3d start;\r
- Point3d end;\r
- Vector3d dir;\r
- \r
- Line line;\r
- \r
- boolean activated;\r
- \r
- SplitPointListener listener;\r
- \r
- public SelectSplitPointAction(ThreeDimensionalEditorBase parent, SplitPointListener listener) {\r
- super(parent);\r
- this.listener = listener;\r
- }\r
- \r
- \r
- public void setSplit(Point3d start, Point3d end) {\r
- this.start = start;\r
- this.end = end;\r
- dir = new Vector3d(end);\r
- dir.sub(start);\r
- }\r
- \r
- \r
- @Override\r
- public void activate() {\r
- if (start == null) throw new RuntimeException("Starting split action without information about range");\r
- \r
-// start = new Point3d();\r
-// end = new Point3d();\r
-// PipingTools.getStraightPipeEnds(PipingTools.getPipeline(straight),\r
-// straight, startStart, startEnd);\r
- \r
- line = new Line();\r
- MaterialState ms = parent.getRenderingComponent().getDisplaySystem().getRenderer().createMaterialState();\r
- ms.setEmissive(new ColorRGBA(1.f,1.f,1.f,1.f));\r
- line.setRenderState(ms);\r
- parent.getRenderingComponent().getNoShadowRoot().attachChild(line);\r
- activated = true;\r
- \r
- }\r
- \r
- @Override\r
- public boolean usable(Graph graph, List<Resource> resources) {\r
-// if (resources.size() != 1)\r
-// return false;\r
-// IEntity entity = EntityFactory.create(graph, resources.get(0));\r
-// if (entity.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthInlineComponent)) {\r
-// return true;\r
-// }\r
- // This is not a standalone action\r
- return false;\r
- }\r
- \r
- @Override\r
- public void deactivate() {\r
- line.removeFromParent();\r
- activated = false;\r
- start = null;\r
- end = null;\r
- dir = null;\r
- \r
- }\r
- \r
- public boolean active() {\r
- return activated;\r
- }\r
- \r
- @Override\r
- public void update() {\r
- if (!activated) {\r
- return;\r
- }\r
- if (input.mouseClicked() && input.clickButton() == MouseEvent.BUTTON3) {\r
- listener.setSplitPoint(null);\r
- activated = false;\r
- return;\r
- }\r
- Vector3d o = new Vector3d();\r
- Vector3d d = new Vector3d();\r
- parent.createPickRay(o, d);\r
-\r
- Vector3d normal = parent.getCamera().getUnNormalizedHeading();\r
- normal.normalize();\r
- normal.negate();\r
- // reference point for selection line\r
- Vector3d point = new Vector3d(start);\r
- Vector3d currentPoint = new Vector3d();\r
- MathTools.intersectStraightPlane(o, d, point, normal, currentPoint);\r
- Point3d startPoint = new Point3d();\r
- double mu[] = new double[2];\r
- MathTools.intersectStraightStraight(start, dir, o, d, startPoint,\r
- new Point3d(), mu);\r
- // startPoint of branch must be between pipe ends\r
- // TODO : take account sizes of elbows (or other components)\r
- if (mu[0] < 0.0)\r
- startPoint.set(start);\r
- else if (mu[0] > 1.0)\r
- startPoint.set(end);\r
-\r
- Vector3f verts[] = new Vector3f[2];\r
- verts[0] = VecmathJmeTools.get(startPoint);\r
- verts[1] = VecmathJmeTools.get(currentPoint);\r
- line.reconstruct(BufferUtils.createFloatBuffer(verts), null, null, null);\r
-\r
- parent.setViewChanged(true);\r
- if (input.mouseClicked() && input.clickButton() == MouseEvent.BUTTON1) {\r
- listener.setSplitPoint(new Point3d(startPoint));\r
- }\r
- \r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.actions;\r
-\r
-import javax.vecmath.Point3d;\r
-\r
-/**\r
- * SplitPointListener is used by SplitPointAction to pass the selected split point.\r
- * Implementing class must set itself as active action into editor (SplitPointAction won't close automatically). \r
- * \r
- * @author Marko Luukkainen <Marko.Luukkainen@vtt.fi>\r
- *\r
- */\r
-public interface SplitPointListener {\r
-\r
- /**\r
- * Sets selected split point, or null if user cancelled the action.\r
- * @param point\r
- */\r
- public void setSplitPoint(Point3d point);\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.actions;\r
-\r
-import java.util.List;\r
-\r
-import javax.vecmath.AxisAngle4f;\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.processeditor.Activator;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.common.ControlPointTools;\r
-import org.simantics.processeditor.stubs.DirectedControlPoint;\r
-import org.simantics.processeditor.stubs.PipeControlPoint;\r
-import org.simantics.processeditor.stubs.VariableAngleTurnComponent;\r
-import org.simantics.proconf.g3d.actions.ConstrainedTransformAction;\r
-import org.simantics.proconf.g3d.actions.TranslateActionConstraints;\r
-import org.simantics.proconf.g3d.base.G3DAPI;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.MathTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.gizmo.TransformInlineGizmo;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-\r
-\r
-public class TranslateElbowAction extends ConstrainedTransformAction {\r
-\r
- TransformInlineGizmo gizmo;\r
- List<IGraphicsNode> mos;\r
- Vector3d dir;\r
- Vector3d orgPos;\r
- double istep = 10.0;\r
- int decimals = 2;\r
- \r
- private Resource pcpResource;\r
- \r
- public TranslateElbowAction(ThreeDimensionalEditorBase parent) {\r
- super(parent);\r
- gizmo = new TransformInlineGizmo(component.getDisplaySystem().getRenderer());\r
- \r
- \r
- }\r
- \r
- public void init() {\r
- this.setText("Translate directed");\r
- this.setToolTipText("Translate the elbow in connections direction");\r
- this.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/translate_d.png"));\r
- }\r
- \r
- \r
- \r
- @Override\r
- public boolean usable(Graph graph, List<Resource> resources) {\r
- // TODO : it should be possible to move multiple components on the same straight\r
- // TODO : checking against elbow and dcp; these are not correct!\r
- if (resources.size() != 1)\r
- return false;\r
- IEntity r = EntityFactory.create(graph,resources.get(0));\r
- if (r.isInstanceOf(ProcessResource.plant3Dresource.VariableAngleTurnComponent)) {\r
- VariableAngleTurnComponent e = new VariableAngleTurnComponent(r);\r
- PipeControlPoint pcp = e.getControlPoint();\r
- PipeControlPoint prev = ControlPointTools.findPreviousEnd(pcp);\r
- PipeControlPoint next = ControlPointTools.findNextEnd(pcp);\r
- DirectedControlPoint dcp = null;\r
- int directedCount = 0;\r
- if (prev != null && prev.isInstanceOf(ProcessResource.plant3Dresource.DirectedControlPoint)) {\r
- directedCount++;\r
- dcp = new DirectedControlPoint(prev);\r
- }\r
- if (next != null && next.isInstanceOf(ProcessResource.plant3Dresource.DirectedControlPoint)) {\r
- directedCount++;\r
- dcp = new DirectedControlPoint(next);\r
- }\r
- if (directedCount == 1) {\r
- orgPos = G3DTools.getVector(dcp.getWorldPosition());\r
- dir = ControlPointTools.getDirectedControlPointDirection(dcp);\r
- pcpResource = pcp.getResource();\r
- return true;\r
- }\r
- } \r
- return false;\r
-\r
- }\r
- \r
- @Override\r
- public void deactivate() {\r
- parent.setGizmo(null);\r
- super.deactivate();\r
- }\r
-\r
- @Override\r
- public void activate() {\r
- parent.setGizmo(gizmo);\r
-\r
- String text = "";\r
- mos = parent.getSelectionAdapter().getSelectedObjects();\r
-// for (IGraphicsNode mo : mos) {\r
-// text += GraphicsNodeTools.getWorldTranslation(mo.getGraphicsNode());//mo.getWorldPosition() + " ";\r
-// }\r
-\r
- mos.iterator().next().getGroup().attachChild(gizmo.getNode());\r
- setInfoText(text); \r
- \r
- Vector3d front = new Vector3d(1.0,0.0,0.0);\r
- Vector3d current = new Vector3d(dir);\r
- float angle = (float)current.angle(front);\r
- AxisAngle4f aa;\r
- if (angle < 0.01 || (Math.PI - angle) < 0.01) {\r
- aa = new AxisAngle4f();\r
- } else {\r
- current.normalize();\r
- Vector3d right = new Vector3d();\r
- right.cross(front, current);\r
-\r
- right.normalize();\r
- if (right.lengthSquared() < 0.01) {\r
- aa = new AxisAngle4f();\r
- } else {\r
- aa = new AxisAngle4f((float) right.x, (float) right.y, (float) right.z, angle);\r
- }\r
- }\r
- gizmo.setRotation(aa);\r
- \r
- updateGizmo();\r
- TranslateActionConstraints.addConstraints(new Resource[]{pcpResource}, detector);\r
- parent.setViewChanged(true);\r
- }\r
- \r
- \r
- \r
- Vector3d getTranslate() {\r
- Vector3d translate = new Vector3d();\r
- Vector3d o = new Vector3d();\r
- Vector3d d = new Vector3d();\r
- parent.createPickRay(o, d);\r
- //Vector3d p = gizmo.getPosition();\r
- if (gizmo.isSelected()) {\r
- double s[] = new double[1];\r
- \r
- Vector3d i1 = new Vector3d();\r
- Vector3d i2 = new Vector3d();\r
- s = new double[2];\r
- MathTools.intersectStraightStraight(orgPos, dir,o, d, i2, i1,s);\r
- translate.set(dir);\r
- if (s[0] < 0.0)\r
- s[0] = 0.0;\r
- \r
- translate.scale(s[0]);\r
- translate.add(orgPos);\r
- \r
- if (useConstraints) {\r
- Vector3d t = new Vector3d(translate);\r
-// FIXME : snapped point may be outside of proper range\r
- Point3d snap = detector.getPointSnap2(t, dir);\r
- if (snap != null) {\r
- translate = new Vector3d(snap);\r
- }\r
- }\r
- \r
- return translate;\r
- }\r
- return null;\r
- }\r
- \r
- Vector3d prevTranslate = new Vector3d();\r
- \r
- @Override\r
- public void doChanges(Graph g) throws Exception {\r
- if (input.mousePressed()) {\r
- //prevTranslate = getTranslate();\r
- \r
- }\r
- if (input.mouseClicked()) {\r
- end();\r
- return;\r
- }\r
- if (!input.mouseDragged()) {\r
- parent.getDefaultAction().update();\r
- return;\r
- } \r
- parent.setViewChanged(true);\r
- \r
- \r
- List<IGraphicsNode> mos = parent.getSelectionAdapter().getSelectedObjects();\r
- Vector3d translate = getTranslate();\r
- \r
- if (translate == null) {\r
- //cameraRotateAction.update();\r
- parent.getDefaultAction().update();\r
- updateGizmo();\r
- return;\r
- }\r
-\r
- String text = "";\r
- for (IGraphicsNode mo : mos) {\r
- G3DNode node = mo.getG3DNode(g);\r
- G3DAPI.setWorldPosition(node, translate);\r
- //G3DTools.setTuple3(node.getW, translation)\r
- //G3DTools.setLocalTranslation(node,translate);\r
- // mo.setLocalTranslation(translate);\r
- text += G3DTools.getVector(node.getWorldPosition()) + " " + translate;// mo.getWorldPosition() + " " +\r
- \r
- }\r
- setInfoText(text);\r
-\r
- updateGizmo();\r
-\r
- }\r
- \r
- protected void updateGizmo() {\r
- gizmo.update(camera.getCameraPos(),component);\r
- }\r
- \r
- public void setInfoText(String text) {\r
- \r
- }\r
-\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.actions;\r
-\r
-import java.util.List;\r
-\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.processeditor.Activator;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.common.PipingTools2;\r
-import org.simantics.processeditor.stubs.InlineComponent;\r
-import org.simantics.processeditor.stubs.PipeControlPoint;\r
-import org.simantics.proconf.g3d.actions.ConstrainedTransformAction;\r
-import org.simantics.proconf.g3d.base.G3DAPI;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.MathTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.gizmo.TransformInlineGizmo;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-\r
-\r
-\r
-public class TranslateInlineComponentAction extends ConstrainedTransformAction {\r
- \r
- TransformInlineGizmo gizmo;\r
- List<IGraphicsNode> mos;\r
- Point3d start;\r
- Point3d end;\r
- Vector3d dir;\r
- double istep = 10.0;\r
- int decimals = 2;\r
- \r
- public TranslateInlineComponentAction(ThreeDimensionalEditorBase parent) {\r
- super(parent);\r
- gizmo = new TransformInlineGizmo(component.getDisplaySystem().getRenderer());\r
-\r
- }\r
- \r
- public void init() {\r
- this.setText("Translate");\r
- this.setToolTipText("Translate the object");\r
- this.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/translate_d.png"));\r
- }\r
- \r
- \r
- \r
- @Override\r
- public boolean usable(Graph graph, List<Resource> resources) {\r
- // TODO : it should be possible to move multiple components on the same straight\r
- if (resources.size() != 1)\r
- return false;\r
- IEntity r = EntityFactory.create(graph,resources.get(0));\r
- PipeControlPoint pcp = null;\r
- if (r.isInstanceOf(ProcessResource.plant3Dresource.FixedLengthInlineComponent)) {\r
- InlineComponent component = new InlineComponent(r);\r
- pcp = component.getControlPoint();\r
- } else {\r
- return false;\r
- }\r
- if (pcp.getNext() == null || pcp.getPrevious() == null)\r
- return false;\r
- return true;\r
- }\r
- \r
- @Override\r
- public void deactivate() {\r
- parent.setGizmo(null);\r
- super.deactivate();\r
- }\r
-\r
- @Override\r
- public void activate() {\r
- parent.setGizmo(gizmo);\r
-\r
- String text = "";\r
- mos = parent.getSelectionAdapter().getSelectedObjects();\r
-// for (IGraphicsNode mo : mos) {\r
-// text += GraphicsNodeTools.getWorldTranslation(mo.getGraphicsNode());//mo.getWorldPosition() + " ";\r
-// }\r
-\r
- mos.iterator().next().getGroup().attachChild(gizmo.getNode());\r
- setInfoText(text); \r
- \r
- \r
- start = new Point3d();\r
- end = new Point3d();\r
- dir = new Vector3d();\r
- parent.getSession().syncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- \r
- InlineComponent ic = new InlineComponent(mos.iterator().next().getG3DNode(g));\r
- PipingTools2.getInlineMovement(ic, start, end);\r
- \r
- //PipingTools2.getInlineComponentEnds(ic, start, end);\r
- dir.set(end);\r
- dir.sub(start);\r
-\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- updateGizmo();\r
- parent.setViewChanged(true);\r
- }\r
- \r
- \r
- \r
- Vector3d getTranslate() {\r
- Vector3d translate = new Vector3d();\r
- Vector3d o = new Vector3d();\r
- Vector3d d = new Vector3d();\r
- parent.createPickRay(o, d);\r
- //Vector3d p = gizmo.getPosition();\r
- if (gizmo.isSelected()) {\r
- double s[] = new double[1];\r
- \r
- Vector3d i1 = new Vector3d();\r
- Vector3d i2 = new Vector3d();\r
- s = new double[2];\r
- MathTools.intersectStraightStraight( start, dir,o, d, i2, i1,s);\r
- translate.set(dir);\r
- if (s[0] < 0.0)\r
- s[0] = 0.0;\r
- else if (s[0] > 1.0)\r
- s[0] = 1.0;\r
- translate.scale(s[0]);\r
- translate.add(start);\r
- \r
- if (useConstraints) {\r
- Vector3d t = new Vector3d(translate);\r
-// FIXME : snapped point may be outside of proper range\r
- Point3d snap = detector.getPointSnap2(t, dir);\r
- if (snap != null) {\r
- translate = new Vector3d(snap);\r
- }\r
- }\r
- \r
- return translate;\r
- }\r
- return null;\r
- }\r
- \r
- Vector3d prevTranslate = new Vector3d();\r
- \r
- @Override\r
- public void doChanges(Graph graph) throws Exception {\r
- if (input.mousePressed()) {\r
- //prevTranslate = getTranslate();\r
- \r
- }\r
- if (input.mouseClicked()) {\r
- end();\r
- return;\r
- }\r
- if (!input.mouseDragged()) {\r
- parent.getDefaultAction().update();\r
- return;\r
- } \r
- parent.setViewChanged(true);\r
- \r
- \r
- List<IGraphicsNode> mos = parent.getSelectionAdapter().getSelectedObjects();\r
- Vector3d translate = getTranslate();\r
- \r
- if (translate == null) {\r
- //cameraRotateAction.update();\r
- parent.getDefaultAction().update();\r
- updateGizmo();\r
- return;\r
- }\r
- //translate.sub(prevTranslate);\r
- \r
-// if ((input.dragModifiers() & MouseEvent.CTRL_MASK) > 0) {\r
-// String text = "";\r
-// for (IGraphicsNode mo : mos) {\r
-// \r
-// Point3d p = mo.getWorldPosition();\r
-// p.add(translate);\r
-// p.x = Math.round(istep * p.x) / istep;\r
-// BigDecimal bx = new BigDecimal(p.x);\r
-// bx.setScale(decimals, BigDecimal.ROUND_HALF_UP);\r
-// p.x = bx.doubleValue();\r
-//\r
-// \r
-// text += p + " ";\r
-// mo.setWorldTranslation(p);\r
-// \r
-// }\r
-// this.parent.setInfoText(text);\r
-// \r
-// } else {\r
- String text = "";\r
- for (IGraphicsNode mo : mos) {\r
- G3DNode node = mo.getG3DNode(graph);\r
- G3DAPI.setWorldPosition(node, translate);\r
- //G3DTools.setLocalTranslation(node, translate);\r
- //mo.setLocalTranslation(translate);\r
- text += G3DTools.getVector(node.getWorldPosition()) +" " + translate;//mo.getWorldPosition() + " " + translate;\r
- }\r
- setInfoText(text);\r
-// }\r
- updateGizmo();\r
-\r
- }\r
- \r
- protected void updateGizmo() {\r
- gizmo.update(camera.getCameraPos(),component);\r
- }\r
- \r
- public void setInfoText(String text) {\r
- \r
- }\r
-\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.actions;\r
-\r
-import java.util.List;\r
-\r
-import javax.vecmath.AxisAngle4f;\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.processeditor.Activator;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.common.ControlPointTools;\r
-import org.simantics.processeditor.common.PipingTools2;\r
-import org.simantics.processeditor.stubs.FixedLengthInlineComponent;\r
-import org.simantics.processeditor.stubs.PipeControlPoint;\r
-import org.simantics.proconf.g3d.actions.ConstrainedTransformAction;\r
-import org.simantics.proconf.g3d.actions.TranslateActionConstraints;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.MathTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.gizmo.AbstractGizmo;\r
-import org.simantics.proconf.g3d.gizmo.TransformGizmo;\r
-import org.simantics.proconf.g3d.gizmo.TransformInlineGizmo;\r
-\r
-
-\r
-\r
-/**\r
- * Action that allows translating VariableLengthInlineComontolPoints.\r
- * \r
- * TODO : Action won't show two gizmos when both ends can be moved\r
- * TODO : With loose ends, gizmo is in the middle of component, when it should be positioned on the end of the component\r
- * \r
- * \r
- * @author Marko Luukkainen <Marko.Luukkainen@vtt.fi>\r
- *\r
- */\r
-public class TranslateStraightAction extends ConstrainedTransformAction {\r
- \r
- private static final int CONNECTED = 0;\r
- private static final int LOOSE = 1;\r
- \r
- private AbstractGizmo gizmo; \r
- private TransformGizmo transformGizmo;\r
- private TransformInlineGizmo transformInlineGizmo;\r
- \r
- \r
- //private Straight straight;\r
- //private PipeControlPoint pcp;\r
- \r
- private Resource pcpResource;\r
- \r
- private int type;\r
-\r
- Vector3d prevTranslate = new Vector3d();\r
- \r
- Point3d start;\r
- Point3d end;\r
- Vector3d dir;\r
- double istep = 10.0;\r
- int decimals = 2;\r
- public TranslateStraightAction(ThreeDimensionalEditorBase parent) {\r
- super(parent);\r
- transformGizmo = new TransformGizmo(component.getDisplaySystem().getRenderer());\r
- transformInlineGizmo = new TransformInlineGizmo(component.getDisplaySystem().getRenderer());\r
- }\r
- \r
- public void init() {\r
- this.setText("Translate");\r
- this.setToolTipText("Translate one end of a straight");\r
- this.setImageDescriptor(Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/translate_d.png"));\r
- }\r
- \r
- @Override\r
- public boolean usable(Graph graph, List<Resource> resources) {\r
- if (resources.size() != 1)\r
- return false;\r
- \r
- IEntity r = EntityFactory.create(graph,resources.get(0));\r
- if (!r.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthInlineComponent)) {\r
- return false;\r
- }\r
- FixedLengthInlineComponent flic = new FixedLengthInlineComponent(r);\r
- PipeControlPoint scp = flic.getControlPoint();\r
- PipeControlPoint start = scp.getPrevious();\r
- PipeControlPoint end = scp.getNext(); \r
- \r
- if (start == null) {\r
- pcpResource = scp.getResource();\r
- type = LOOSE;\r
- return true;\r
- }\r
- if (end == null) {\r
- pcpResource = scp.getResource();\r
- type = LOOSE;\r
- return true;\r
- }\r
- if (start.isInstanceOf(ProcessResource.plant3Dresource.BranchEndControlPoint)) {\r
- pcpResource = graph.getObjects(start.getResource(), ProcessResource.plant3Dresource.SubPointOf).iterator().next();\r
- type = CONNECTED;\r
- return true;\r
- }\r
- if (end.isInstanceOf(ProcessResource.plant3Dresource.BranchEndControlPoint)) {\r
- pcpResource = graph.getObjects(end.getResource(), ProcessResource.plant3Dresource.SubPointOf).iterator().next();\r
- type = CONNECTED;\r
- return true;\r
- }\r
- \r
-\r
- return false;\r
- \r
- }\r
- \r
- @Override\r
- public void deactivate() {\r
- super.deactivate();\r
- parent.setGizmo(null);\r
-\r
- }\r
-\r
- @Override\r
- public void activate() {\r
- parent.getSession().syncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- PipeControlPoint pcp = new PipeControlPoint(g,pcpResource);\r
- if (type == CONNECTED) {\r
- gizmo = transformInlineGizmo;\r
- \r
- start = new Point3d();\r
- end = new Point3d();\r
- dir = new Vector3d();\r
- //ControlPointTools.getInlineControlPointEnds(pcp, start, end, dir);\r
- ControlPointTools.getInlineMovement(pcp, start, end);\r
- \r
- //PipingTools2.getInlineComponentEnds(ic, start, end);\r
- dir.set(end);\r
- dir.sub(start);\r
- \r
- //System.out.println(start + " " + end + " " + dir);\r
- Vector3d front = new Vector3d(1.0,0.0,0.0);\r
- Vector3d current = new Vector3d(dir);\r
- float angle = (float)current.angle(front);\r
- AxisAngle4f aa;\r
- if (angle < 0.01 || (Math.PI - angle) < 0.01) {\r
- aa = new AxisAngle4f();\r
- } else {\r
- current.normalize();\r
- Vector3d right = new Vector3d();\r
- right.cross(front, current);\r
-\r
- right.normalize();\r
- if (right.lengthSquared() < 0.01) {\r
- aa = new AxisAngle4f();\r
- } else {\r
- aa = new AxisAngle4f((float) right.x, (float) right.y, (float) right.z, angle);\r
- }\r
- }\r
- transformInlineGizmo.setRotation(aa);\r
- \r
- } else {\r
- gizmo = transformGizmo;\r
- }\r
- parent.setGizmo(gizmo);\r
-\r
- component.getNoShadowRoot().attachChild(gizmo.getNode());\r
-\r
- updateGizmo(pcp);\r
- TranslateActionConstraints.addConstraints(new Resource[]{pcpResource}, detector);\r
- parent.setViewChanged(true);\r
- \r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- }\r
- \r
- \r
- // FIXME : copy-paste from TranslateInlineAction.getTranslate()\r
- Vector3d getTranslate() {\r
- Vector3d translate = new Vector3d();\r
- Vector3d o = new Vector3d();\r
- Vector3d d = new Vector3d();\r
- parent.createPickRay(o, d);\r
- // Vector3d p = gizmo.getPosition();\r
- if (((TransformInlineGizmo) gizmo).isSelected()) {\r
- double s[] = new double[1];\r
-\r
- Vector3d i1 = new Vector3d();\r
- Vector3d i2 = new Vector3d();\r
- s = new double[2];\r
- MathTools.intersectStraightStraight(start, dir, o, d, i2, i1, s);\r
- translate.set(dir);\r
- if (s[0] < 0.0)\r
- s[0] = 0.0;\r
- else if (s[0] > 1.0)\r
- s[0] = 1.0;\r
- translate.scale(s[0]);\r
- translate.add(start);\r
- \r
- if (useConstraints) {\r
- Vector3d t = new Vector3d(translate);\r
- // FIXME : snapped point may be outside of proper range\r
- Point3d snap = detector.getPointSnap2(t, dir);\r
- if (snap != null) {\r
- translate = new Vector3d(snap);\r
- }\r
- }\r
-\r
- return translate;\r
- }\r
- return null;\r
- }\r
- // FIXME : copy-paste from TranslateAction.getTranslate(Vector3d v)\r
- Vector3d getTranslate(PipeControlPoint pcp, Vector3d offset) {\r
- Vector3d translate = new Vector3d();\r
- Vector3d o = new Vector3d();\r
- Vector3d d = new Vector3d();\r
- parent.createPickRay(o, d);\r
- Vector3d p = ((TransformGizmo)gizmo).getPosition();\r
- Vector3d dir = null;\r
- switch (((TransformGizmo)gizmo).getSelected()) {\r
- case TransformGizmo.XYZ :\r
- Vector3d normal = camera.getUnNormalizedHeading();\r
- normal.normalize();\r
- double s[] = new double[1];\r
- Vector3d r = new Vector3d();\r
- if (MathTools.intersectStraightPlane(o, d, p, normal, r)) {\r
- r.sub(p);\r
- translate.x = r.x;\r
- translate.y = r.y;\r
- translate.z = r.z;\r
- }\r
- break;\r
- case TransformGizmo.X :\r
- dir = new Vector3d(1.0,0.0,0.0);\r
- Vector3d i1 = new Vector3d();\r
- Vector3d i2 = new Vector3d();\r
- s = new double[2];\r
- MathTools.intersectStraightStraight( p, dir,o, d, i2, i1,s);\r
- translate.x = s[0];\r
- \r
- break;\r
- case TransformGizmo.Y :\r
- dir = new Vector3d(0.0,1.0,0.0);\r
- i1 = new Vector3d();\r
- i2 = new Vector3d();\r
- s = new double[2];\r
- MathTools.intersectStraightStraight( p, dir,o, d, i2, i1,s);\r
- translate.y = s[0];\r
- break;\r
- case TransformGizmo.Z :\r
- dir = new Vector3d(0.0,0.0,1.0);\r
- i1 = new Vector3d();\r
- i2 = new Vector3d();\r
- s = new double[2];\r
- MathTools.intersectStraightStraight( p, dir,o, d, i2, i1,s);\r
- translate.z = s[0];\r
- break;\r
- case TransformGizmo.XY :\r
- normal = new Vector3d(0.0,0.0,1.0);\r
- s = new double[1];\r
- r = new Vector3d();\r
- if (MathTools.intersectStraightPlane(o, d, p, normal, r)) {\r
- r.sub(p);\r
- translate.x = r.x;\r
- translate.y = r.y;\r
- }\r
- break;\r
- case TransformGizmo.XZ :\r
- normal = new Vector3d(0.0,1.0,0.0);\r
- s = new double[1];\r
- r = new Vector3d();\r
- if (MathTools.intersectStraightPlane(o, d, p, normal, r)) {\r
- r.sub(p);\r
- translate.x = r.x;\r
- translate.z = r.z;\r
- }\r
- break;\r
- case TransformGizmo.YZ :\r
- normal = new Vector3d(1.0,0.0,0.0);\r
- s = new double[1];\r
- r = new Vector3d();\r
- if (MathTools.intersectStraightPlane(o, d, p, normal, r)) {\r
- r.sub(p);\r
- translate.y = r.y;\r
- translate.z = r.z;\r
- }\r
- break;\r
- default :\r
- \r
- return null;\r
- }\r
- //System.out.println(translate + " " + offset);\r
- translate.sub(offset);\r
- \r
- if (useConstraints) {\r
- switch (((TransformGizmo)gizmo).getSelected()) {\r
- case TransformGizmo.X:\r
- case TransformGizmo.Y:\r
- case TransformGizmo.Z:\r
- Vector3d t = new Vector3d(translate);\r
- // TODO : to the test against all translated objects and snap to closest one\r
- Point3d pos = G3DTools.getPoint(pcp.getLocalPosition());\r
- t.add(pos);\r
- Point3d snap = detector.getPointSnap2(t, dir);\r
- if (snap != null) {\r
- // System.out.print("t: " + translate);\r
- translate = new Vector3d(snap);\r
- translate.sub(pos);\r
- // System.out.println(" " + translate);\r
- }\r
- break;\r
- \r
- }\r
- }\r
- //System.out.println(translate);\r
- return translate;\r
- }\r
- \r
- \r
- \r
- @Override\r
- public void doChanges(Graph graph) throws Exception {\r
- PipeControlPoint pcp = new PipeControlPoint(graph, pcpResource); \r
- if (input.mousePressed()) {\r
- if (type == LOOSE)\r
- prevTranslate = getTranslate(pcp,new Vector3d());\r
- \r
- }\r
- if (input.mouseClicked()) {\r
- //System.out.println("end");\r
- end();\r
- return;\r
- }\r
- if (!input.mouseDragged()) {\r
- parent.getDefaultAction().update();\r
- return;\r
- } \r
- detector.clearConstraintHighlights();\r
- parent.setViewChanged(true);\r
- \r
- \r
- Vector3d translate;\r
- if (type == CONNECTED)\r
- translate = getTranslate();\r
- else\r
- translate = getTranslate(pcp,prevTranslate);\r
- \r
- if (translate == null) {\r
- //cameraRotateAction.update();\r
- parent.getDefaultAction().update();\r
- updateGizmo(pcp);\r
- return;\r
- }\r
-\r
- String text = "";\r
- \r
- if (type == CONNECTED) {\r
- G3DTools.setTuple3(pcp.getWorldPosition(), translate);\r
- // mo.setLocalTranslation(translate);\r
- //text += GraphicsNodeTools.getWorldTranslation(mo.getGraphicsNode()) + " " + translate;// mo.getWorldPosition()\r
- if (useConstraints)\r
- text+=detector.getSnapString();\r
-\r
- } else {\r
- G3DTools.addTuple3(pcp.getWorldPosition(), translate);\r
- // mo.modifyWorldTranslation(translate);\r
- //text += GraphicsNodeTools.getWorldTranslation(mo.getGraphicsNode()) + " ";//mo.getWorldPosition() + " ";\r
- if (useConstraints)\r
- text+=detector.getSnapString();\r
- \r
- }\r
- \r
- setInfoText(text);\r
- updateGizmo(pcp);\r
-\r
- }\r
- \r
- protected void updateGizmo(PipeControlPoint pcp) {\r
- gizmo.update(G3DTools.getVector(pcp.getWorldPosition()), camera.getCameraPos(), component);\r
- }\r
- \r
- public void setInfoText(String text) {\r
- \r
- }\r
-\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.adapters;\r
-\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.adaption.AdaptionException;\r
-import org.simantics.db.adaption.ResourceAdapter;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.common.PipingTools2;\r
-import org.simantics.proconf.g3d.base.Constraint;\r
-\r
-\r
-public class InlineComponentConstraintAdapter implements ResourceAdapter {\r
- @SuppressWarnings("unchecked")\r
- @Override\r
- public <T> T adapt(Graph graph, Resource resource, Resource mia) throws AdaptionException {\r
- Constraint c = new Constraint();\r
- assert(graph.isInstanceOf(resource, ProcessResource.plant3Dresource.InlineComponent));\r
- IEntity ent = EntityFactory.create(graph,resource);\r
- Point3d center = new Point3d();\r
- Point3d p1 = new Point3d();\r
- Point3d p2 = new Point3d();\r
- Vector3d dir = new Vector3d();\r
- PipingTools2.getInlineComponentEnds(ent, center, p1, p2, dir);\r
- c.points.add(center);\r
- c.points.add(p1);\r
- c.points.add(p2);\r
- c.dirs.add(dir);\r
- return (T) c;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.adapters;\r
-\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.adaption.AdaptionException;\r
-import org.simantics.db.adaption.ResourceAdapter;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.common.PipingTools2;\r
-import org.simantics.proconf.g3d.base.Constraint;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-\r
-\r
-public class NozzleConstraintAdapter implements ResourceAdapter {\r
- @SuppressWarnings("unchecked")\r
- @Override\r
- public <T> T adapt(Graph graph, Resource resource, Resource mia) throws AdaptionException {\r
- Constraint c = new Constraint();\r
- assert(graph.isInstanceOf(resource, ProcessResource.plant3Dresource.Nozzle));\r
- IEntity ent = EntityFactory.create(graph,resource);\r
- Vector3d dir = PipingTools2.getNozzleDirection(ent);\r
- Point3d center = G3DTools.getPoint(ent.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition));\r
- c.points.add(center);\r
- c.dirs.add(dir);\r
- return (T) c;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.adapters;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.Property;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.common.ControlPointTools;\r
-import org.simantics.processeditor.common.PipingRules;\r
-import org.simantics.processeditor.scenegraph.NonVisibleNode;\r
-import org.simantics.processeditor.scenegraph.PipeComponentNode;\r
-import org.simantics.processeditor.scenegraph.PipeRunNode;\r
-import org.simantics.processeditor.scenegraph.PipelineComponentNode;\r
-import org.simantics.processeditor.stubs.PipeControlPoint;\r
-import org.simantics.processeditor.stubs.PipeRun;\r
-import org.simantics.processeditor.stubs.Plant3DResource;\r
-import org.simantics.proconf.g3d.base.JmeRenderingComponent;\r
-import org.simantics.proconf.g3d.base.ScenegraphAdapterImpl;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.scenegraph.IGeometryNode;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.scenegraph.ISelectableNode;\r
-import org.simantics.proconf.g3d.scenegraph.ParameterizedModelNode;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-public class ProcessEditorAdapter extends ScenegraphAdapterImpl {\r
- private ThreeDimensionalEditorBase editor;\r
- \r
- public ProcessEditorAdapter(ThreeDimensionalEditorBase editor, Session session, JmeRenderingComponent component) {\r
- super(session, component);\r
- this.editor = editor;\r
- }\r
- \r
- private class NormalScenegraphQuery extends ScenegraphQuery {\r
- \r
- public NormalScenegraphQuery(Resource node) {\r
- super(node);\r
- } \r
- \r
- \r
- @Override\r
- public void shapeAdded(Graph graph, IGraphicsNode node) {\r
- // FIXME : this won't work like in previous ProConf\r
- }\r
- }\r
- \r
- private Map<Resource,PipeRunControlPointQuery> pipeRunQueries = new HashMap<Resource, PipeRunControlPointQuery>();\r
-\r
- protected ScenegraphQuery newSubnodeListener(G3DNode node) {\r
- if (node.isInstanceOf(ProcessResource.plant3Dresource.PipeRun)) {\r
- PipeRunControlPointQuery query = new PipeRunControlPointQuery(node.getResource());\r
- pipeRunQueries.put(node.getResource(), query);\r
- node.getGraph().performQuery(query);\r
- }\r
- return new NormalScenegraphQuery(node.getResource());\r
- \r
- }\r
- \r
- @Override\r
- protected NodePropertyQuery newRootPropertyListener(G3DNode root) {\r
- // currently Plant does not have any properties.\r
- return null;\r
- }\r
- \r
- private class TransformationQuery extends NodeTransformationQuery {\r
- \r
- public TransformationQuery(Resource res) {\r
- super(res);\r
- }\r
- \r
- @Override\r
- public void shapeUpdated(Graph graph, IGraphicsNode shape) {\r
- //if (shape instanceof IGeometryNode) {\r
- // updateGeometry((IGeometryNode)shape);\r
- //} else {\r
- shape.updateTransform(graph);\r
- //}\r
- }\r
- }\r
- \r
- @Override\r
- protected NodeTransformationQuery newTransformationListener(G3DNode root) {\r
- return new TransformationQuery(root.getResource());\r
- }\r
- \r
- private class NormalNodePropertyQuery extends org.simantics.proconf.g3d.base.ScenegraphAdapterImpl.NodePropertyQuery {\r
- \r
- public NormalNodePropertyQuery(Resource resource) {\r
- super(resource);\r
- }\r
-\r
- @Override\r
- public void shapeUpdated(Graph graph,IGraphicsNode shape) {\r
- if (shape instanceof IGeometryNode) {\r
- updateGeometry((IGeometryNode)shape);\r
- } else {\r
- shape.updateTransform(graph);\r
- }\r
- }\r
- }\r
- @Override\r
- protected NodePropertyQuery newPropertyListener(G3DNode node) {\r
- return new NormalNodePropertyQuery(node.getResource());\r
- }\r
-\r
- @Override\r
- protected IGraphicsNode instantiateNode(IGraphicsNode parent,\r
- G3DNode node) {\r
- Plant3DResource p3r = ProcessResource.plant3Dresource;\r
- IGraphicsNode newNode = null;\r
- try {\r
- if (node.isInstanceOf(p3r.Equipment)) {\r
- newNode = new ParameterizedModelNode(\r
- editor, parent, node.getGraph(),\r
- node.getResource(), p3r.HasGraphics);\r
- } else if (node.isInstanceOf(p3r.PipeRun)) {\r
- newNode = new PipeRunNode(parent, node.getGraph(), node.getResource());\r
- } else if (node.isInstanceOf(p3r.Nozzle)) {\r
- newNode = new ParameterizedModelNode(\r
- editor, parent, node.getGraph(),\r
- node.getResource(), p3r.HasGraphics);\r
- // CodedComponent must be handled first since it uses\r
- // hard-coded geometries\r
- // TODO : is this really necessary, or could we unify\r
- // PipeComponentNode, InlineComponentNode,...\r
- } else if (node.isInstanceOf(p3r.CodedComponent)) {\r
- newNode = new PipeComponentNode(editor,\r
- parent, node.getGraph(), node.getResource());\r
- } else if (node.isInstanceOf(p3r.NonVisibleComponent)) {\r
- newNode = new NonVisibleNode(parent, node.getGraph(), node.getResource());\r
- } else if (node.isInstanceOf(p3r.PipelineComponent)) {\r
- newNode = new PipelineComponentNode(editor,\r
- parent, node.getGraph(), node.getResource());\r
- } \r
-\r
- // } else if (node instanceof Shape) // Markers (ar/mobile)\r
- // needed this\r
- // newNode = new ShapeNode(TestProcessEditor.this,parent,node);\r
- if (newNode != null) {\r
- if (newNode instanceof ISelectableNode)\r
- ((ISelectableNode) newNode).setVisible(true);\r
- if (newNode instanceof IGeometryNode) {\r
- updateGeometry((IGeometryNode) newNode);\r
- }\r
- return newNode;\r
- }\r
- } catch (Exception e) {\r
- ErrorLogger.defaultLogError("Cannot handle node " + node.getResource(), e);\r
- return null;\r
- }\r
- ErrorLogger.defaultLogError("Cannot handle node " + node.getResource(), null);\r
- return null;\r
-\r
- }\r
-\r
- /**\r
- * This is used to create elbows and straight pipes to pipeline TODO :\r
- * this should be done with rule-engine!\r
- * \r
- * \r
- * @author Marko Luukkainen\r
- * \r
- */\r
- protected class PipeRunControlPointQuery extends NodeQuery {\r
- private List<Resource> removed = new ArrayList<Resource>();\r
- private List<Resource> added = new ArrayList<Resource>();\r
-\r
- public PipeRunControlPointQuery(Resource r) {\r
- super(r);\r
- if (DEBUG) System.out.println("Created PipeRunControlPointQuery for " + r);\r
-\r
- }\r
-\r
- @Override\r
- protected Object compute2(Graph graph) {\r
- PipeRun run = new PipeRun(graph, nodeResource);\r
- Collection<IEntity> cps = run\r
- .getRelatedObjects(ProcessResource.plant3Dresource.HasControlPoints);\r
- List<Resource> res = new ArrayList<Resource>();\r
- for (IEntity t : cps)\r
- res.add(t.getResource());\r
- return res;\r
- }\r
-\r
- @Override\r
- public boolean updated(Graph graph, Object oldResult,\r
- Object newResult) {\r
- \r
- removed.clear();\r
- added.clear();\r
-\r
- List<Resource> oldCps = (List<Resource>) oldResult;\r
- List<Resource> newCps = (List<Resource>) newResult;\r
- if (oldCps == null)\r
- oldCps = new ArrayList<Resource>();\r
-\r
- for (Resource r : oldCps) {\r
- if (!newCps.contains(r))\r
- removed.add(r);\r
- }\r
-\r
- for (Resource r : newCps) {\r
- if (!oldCps.contains(r))\r
- added.add(r);\r
- }\r
- for (Resource r : removed)\r
- removeControlPoint(graph, r);\r
- for (Resource r : added) {\r
- addControlPoint(graph, r);\r
- // ControlPointTools.addControlPoint(new\r
- // PipeRun(graph,pipeRun), new PipeControlPoint(graph, r));\r
- }\r
-\r
- return (added.size() > 0 || removed.size() > 0);\r
- }\r
- \r
- @Override\r
- public void dispose() {\r
- super.dispose();\r
- for (ControlPointPropertyQuery q : controlPointPropertyQueries.values())\r
- q.dispose();\r
- controlPointPropertyQueries.clear();\r
- }\r
- \r
- private Map<Resource,ControlPointPropertyQuery> controlPointPropertyQueries = new HashMap<Resource, ControlPointPropertyQuery>();\r
- \r
- private void addControlPoint(Graph graph, Resource resource) {\r
- ControlPointPropertyQuery query = new ControlPointPropertyQuery(resource);\r
- graph.performQuery(query);\r
- controlPointPropertyQueries.put(resource,query);\r
- }\r
- \r
- private void removeControlPoint(Graph graph, Resource resource) {\r
- ControlPointPropertyQuery query = controlPointPropertyQueries.remove(resource);\r
- query.dispose();\r
- ControlPointTools.removeControlPoint(new PipeControlPoint(\r
- graph, resource));\r
- }\r
-\r
- }\r
-\r
- protected class ControlPointPropertyQuery extends NodeQuery {\r
- boolean initialized = false;\r
- \r
- public ControlPointPropertyQuery(Resource r) {\r
- super(r);\r
- if (DEBUG) System.out.println("Created ControlPointPropertyQuery for " + r);\r
- }\r
- \r
- @Override\r
- public List<Object> compute2(Graph g) {\r
- IEntity t = EntityFactory.create(g,nodeResource);\r
- \r
- Collection<Property> properties = t.getRelatedProperties(ProcessResource.builtins.HasProperty);\r
- List<Object> propertyValues = new ArrayList<Object>();\r
- p(properties,propertyValues);\r
-\r
- return propertyValues;\r
- }\r
- \r
- private void p(Collection<Property> properties, List<Object> propertyValues) {\r
- for (Property p : properties) {\r
- Collection<Property> subProperties = p.getRelatedProperties(p.getGraph().getBuiltins().HasProperty);\r
- if (subProperties.size() != 0) {\r
- p(subProperties,propertyValues);\r
- } \r
- if (p.hasValue()){\r
- propertyValues.add(p.getValue());\r
- }\r
- }\r
- }\r
- \r
- @Override\r
- public boolean updated(Graph graph, Object oldResult, Object newResult) {\r
- PipingRules.pipeControlPointPositionUpdate(graph, this.nodeResource);\r
- if (initialized) {\r
- //PipingRules.pipeControlPointPositionUpdate(graph, this.nodeResource);\r
- } else {\r
- initialized = true;\r
- }\r
- return true;\r
- }\r
- }\r
- \r
- @Override\r
- protected void removeNode(Resource parent, Resource r) {\r
- super.removeNode(parent, r);\r
- PipeRunControlPointQuery q = pipeRunQueries.get(r);\r
- if (q != null)\r
- q.dispose();\r
- }\r
- \r
- @Override\r
- public void dispose() {\r
- super.dispose();\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.adapters;\r
-\r
-import java.util.List;\r
-\r
-import org.simantics.proconf.g3d.base.ScenegraphAdapter;\r
-import org.simantics.proconf.g3d.base.SelectionAdapter;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.scenegraph.ISelectableNode;\r
-\r
-public class ProcessEditorSelectionAdapter extends SelectionAdapter {\r
- \r
- \r
- public ProcessEditorSelectionAdapter(ScenegraphAdapter adapter) {\r
- super(adapter);\r
- }\r
-\r
- @Override\r
- public void setEditorSelection() {\r
- List<IGraphicsNode> sel = getSelectedObjects();\r
- for (IGraphicsNode o : adapter.getNodes())\r
- if (o instanceof ISelectableNode) {\r
- if (sel.contains(o)) {\r
- ((ISelectableNode)o).setSelected(true);\r
- } else {\r
- ((ISelectableNode)o).setSelected(false);\r
- }\r
- }\r
- }\r
-\r
-\r
- @Override\r
- protected void setEditorHighlightSelection() {\r
- List<IGraphicsNode> sel = getInteractiveSelectedObjects();\r
- for (IGraphicsNode o : adapter.getNodes())\r
- if (o instanceof ISelectableNode) {\r
- if (sel.contains(o)) {\r
- ((ISelectableNode)o).setHighlighted(true);\r
- } else {\r
- ((ISelectableNode)o).setHighlighted(false);\r
- }\r
- }\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.adapters;\r
-\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.adaption.AdaptionException;\r
-import org.simantics.db.adaption.ResourceAdapter;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.actions.PositionType;\r
-import org.simantics.processeditor.common.ControlPointTools;\r
-import org.simantics.processeditor.common.PipingTools2.Direction;\r
-import org.simantics.proconf.g3d.base.Constraint;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-\r
-\r
-public class TurnComponentConstraintAdapter implements ResourceAdapter {\r
- @SuppressWarnings("unchecked")\r
- @Override\r
- public <T> T adapt(Graph graph, Resource resource, Resource mia) throws AdaptionException {\r
- Constraint c = new Constraint();\r
- assert(graph.isInstanceOf(resource, ProcessResource.plant3Dresource.TurnComponent));\r
- IEntity ent = EntityFactory.create(graph,resource);\r
- IEntity pcp = ent.getSingleRelatedObject(ProcessResource.plant3Dresource.HasControlPoint);\r
- \r
- Point3d center = G3DTools.getPoint(pcp.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition));\r
- Point3d p1 = ControlPointTools.getRealPosition(pcp, PositionType.NEXT);\r
- Point3d p2 = ControlPointTools.getRealPosition(pcp, PositionType.PREVIOUS);\r
- Vector3d dir1 = ControlPointTools.getPathLegDirection(pcp, Direction.NEXT);\r
- Vector3d dir2 = ControlPointTools.getPathLegDirection(pcp, Direction.PREVIOUS);\r
- c.points.add(center);\r
- c.points.add(p1);\r
- c.points.add(p2);\r
- c.dirs.add(dir1);\r
- c.dirs.add(dir2);\r
- return (T) c;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.animations;\r
-\r
-import java.net.URL;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import org.eclipse.core.runtime.FileLocator;\r
-import org.eclipse.core.runtime.Path;\r
-import org.simantics.db.Graph;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.processeditor.Activator;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.stubs.PipeRun;\r
-import org.simantics.processeditor.stubs.VariableLengthInlineComponent;\r
-import org.simantics.proconf.g3d.animation.Animatable;\r
-import org.simantics.proconf.g3d.animation.AnimationController;\r
-import org.simantics.proconf.g3d.base.JmeRenderingComponent;\r
-\r
-import com.jme.bounding.BoundingBox;\r
-import com.jme.image.Texture;\r
-import com.jme.intersection.PickResults;\r
-import com.jme.math.Ray;\r
-import com.jme.renderer.Renderer;\r
-import com.jme.scene.Node;\r
-import com.jme.scene.state.AlphaState;\r
-import com.jme.scene.state.TextureState;\r
-import com.jme.scene.state.ZBufferState;\r
-import com.jme.util.TextureManager;\r
-import com.jmex.effects.particles.ParticleGeometry;\r
-\r
-\r
-\r
-public class PipeAnimationController implements AnimationController {\r
- private List<ParticleGeometry> pipeAnimations = new ArrayList<ParticleGeometry>();\r
- \r
- List<PipeFlowAnimation> animatables = new ArrayList<PipeFlowAnimation>();\r
- \r
- private double d = Math.random();\r
- private double delta = 0.01;\r
- \r
- AlphaState as1;\r
- TextureState ts;\r
- Node particleNode = new Node() {\r
- private static final long serialVersionUID = 7477121374264124684L;\r
-\r
- // Without this picking code tries to pick particles which doesn't work (Causes class cast exception)\r
- public void findPick(Ray toTest, PickResults results) {\r
- return;\r
- }\r
- };\r
- \r
- public PipeAnimationController(JmeRenderingComponent component, PipeRun pipeline) {\r
- as1 = component.getDisplaySystem().getRenderer().createAlphaState();\r
- as1.setBlendEnabled(true);\r
- as1.setSrcFunction(AlphaState.SB_SRC_ALPHA);\r
- as1.setDstFunction(AlphaState.DB_ONE);\r
- //as1.setDstFunction(AlphaState.DB_ONE_MINUS_SRC_ALPHA);\r
- as1.setTestEnabled(true);\r
- as1.setTestFunction(AlphaState.TF_GREATER);\r
- as1.setEnabled(true);\r
-\r
- TextureState ts = component.getDisplaySystem().getRenderer().createTextureState();\r
- //URL url = FileLocator.find(com.jme.eclipse.Activator.getDefault().getBundle(),new Path("data/textures/flaresmall.jpg"),null);\r
- URL url = FileLocator.find(Activator.getDefault().getBundle(),new Path("icons/bubble.png"),null);\r
- \r
- ts.setTexture(\r
- TextureManager.loadTexture(url,\r
- Texture.MM_LINEAR_LINEAR,\r
- Texture.FM_LINEAR));\r
- ts.setEnabled(true);\r
- \r
- ZBufferState zs = component.getDisplaySystem().getRenderer().createZBufferState();\r
- zs.setFunction(ZBufferState.CF_LEQUAL);\r
- zs.setWritable(false);\r
- //zs.setFunction(ZBufferState.CF_ALWAYS);\r
- particleNode.setRenderState(as1);\r
- particleNode.setRenderState(ts);\r
- particleNode.setRenderState(zs);\r
- particleNode.setRenderQueueMode(Renderer.QUEUE_TRANSPARENT);\r
- component.getShadowRoot().attachChild(particleNode);\r
- createAnimations(pipeline);\r
- }\r
- \r
- public void addAnimatable(Animatable animatable) {\r
- animatables.add((PipeFlowAnimation)animatable);\r
- \r
- }\r
- \r
- public void setAnimatable(Animatable animatable) {\r
- animatables.clear();\r
- animatables.add((PipeFlowAnimation)animatable);\r
- \r
- }\r
- \r
- \r
- public void updateAnimation(Graph g, double frameTime) {\r
- d += delta;\r
- if (d > 1.0) {\r
- d = 1.0;\r
- delta = -delta;\r
- } else if (d < 0.0) {\r
- delta = -delta;\r
- d = 0.0;\r
- }\r
- for (Animatable a : animatables)\r
- a.animate(d,frameTime); \r
- }\r
- \r
- public void dispose() {\r
- for (ParticleGeometry p : pipeAnimations)\r
- p.removeFromParent();\r
- pipeAnimations.clear();\r
- \r
- }\r
- \r
- private void createAnimations(PipeRun pipeline) {\r
- List<IEntity> straights = new ArrayList<IEntity>();\r
- for (IEntity t : pipeline.getChild()) {\r
- if (t.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthInlineComponent))\r
- straights.add(t);\r
- }\r
- \r
- for (IEntity r : straights) {\r
- animatables.add(new PipeFlowAnimation(pipeAnimations, particleNode, new VariableLengthInlineComponent(r),false));\r
- }\r
- particleNode.setModelBound(new BoundingBox());\r
- particleNode.updateModelBound();\r
- particleNode.updateRenderState();\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.animations;\r
-\r
-import java.util.List;\r
-\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.processeditor.common.ControlPointTools;\r
-import org.simantics.processeditor.stubs.PipeControlPoint;\r
-import org.simantics.processeditor.stubs.VariableLengthInlineComponent;\r
-import org.simantics.proconf.g3d.animation.Animatable;\r
-import org.simantics.proconf.g3d.base.VecmathJmeTools;\r
-\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.scene.Node;\r
-import com.jmex.effects.particles.ParticleFactory;\r
-import com.jmex.effects.particles.ParticleGeometry;\r
-\r
-\r
-\r
-\r
-public class PipeFlowAnimation implements Animatable{ \r
- \r
- ParticleGeometry particle;\r
- float length;\r
- int numParticles;\r
- \r
- public PipeFlowAnimation(List<ParticleGeometry> pipeAnimations, Node particleNode, VariableLengthInlineComponent s, boolean reversed) {\r
- PipeControlPoint pcp = s.getControlPoint();\r
- \r
- Point3d p1 = new Point3d();\r
- Point3d p2 = new Point3d();\r
- \r
- ControlPointTools.getInlineControlPointEnds(pcp, p2, p1);\r
-\r
- if (reversed) {\r
- Point3d t = p1;\r
- p1 = p2;\r
- p2 = t;\r
- }\r
- \r
- \r
- Vector3d dir = new Vector3d(p2);\r
- dir.sub(p1);\r
- length = (float)dir.length();\r
- //if (length < 0.1f)\r
- // return;\r
- //continue;\r
- // with longer pipes particles will travel too far so the length of the pipe must be scaled\r
- length *= 0.83f;\r
- float vel = 0.1f;\r
- //float size = (float)s.getPipeRadiusValue() + 0.1f;\r
- //size *= 2.f;\r
- float size = (float)s.getPipeDiameter()[0];\r
- //size *= 1.2f;\r
- float life = length/vel;\r
- \r
- //int releaseRate = 40;\r
- //int numParticles = (int)(releaseRate * life / 100.f);//(int)(releaseRate * life / 500.f);\r
- \r
- numParticles = (int)(length * 2.0);\r
- int releaseRate = (int)((numParticles * 500.0) / life);\r
- \r
- if (numParticles < 2)\r
- numParticles = 2;\r
- \r
- particle = ParticleFactory.buildParticles("Animation of " + s.getResource().getResourceId(),numParticles, ParticleGeometry.PT_QUAD);//new ParticleMesh("Animation of " + r.getId(),40);\r
- particle.setEmissionDirection(VecmathJmeTools.get(dir).normalize());\r
- particle.setLocalTranslation(VecmathJmeTools.get(p1));\r
- particle.setEmitType(ParticleGeometry.ET_POINT);\r
- particle.setInitialVelocity(vel);\r
- particle.setMinimumAngle(0.f);\r
- particle.setMaximumAngle(0.f);\r
- particle.setReleaseRate(releaseRate);\r
- particle.getParticleController().setReleaseVariance(0.f);\r
- particle.getParticleController().setControlFlow(true);\r
- particle.setStartColor(new ColorRGBA(1.f,1.f,0.f,1.f));\r
- particle.setEndColor(new ColorRGBA(1.f,1.f,0.f,1.f));\r
- particle.setStartSize(size);\r
- particle.setEndSize(size);\r
- setFlow(vel);\r
- particle.getParticleController().setSpeed(vel);\r
- particle.warmUp(60);\r
- pipeAnimations.add(particle);\r
- particleNode.attachChild(particle);\r
- }\r
- \r
- ParticleGeometry getParticleGeometry() {\r
- return particle;\r
- }\r
- \r
- private void setFlow(float vel) {\r
- float life;\r
- if (vel > 0.f)\r
- life = length/vel;\r
- else\r
- life = 0.f;\r
- particle.setInitialVelocity(vel);\r
- particle.setMaximumLifeTime(life);\r
- particle.setMinimumLifeTime(life);\r
- particle.getParticleController().setSpeed(vel);\r
-\r
- }\r
- \r
- private void setReleaserate(float vel) {\r
- float life;\r
- if (vel > 0.f)\r
- life = length/vel;\r
- else\r
- life = 0.f;\r
- particle.setInitialVelocity(vel);\r
- particle.setMaximumLifeTime(life);\r
- particle.setMinimumLifeTime(life);\r
- particle.setReleaseRate((int)((numParticles * 500.0) / life));\r
- }\r
- \r
- public void animate(double delta,double frameRate) {\r
- //setFlow(0.1f*(float)delta);\r
- setReleaserate(0.05f*(float)delta);\r
- }\r
- \r
- public boolean setAnimation(Graph graph, Resource animation) {\r
- return false;\r
- }\r
- \r
- public boolean setRandomAnimation(Graph graph) {\r
- return false;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.animations;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.processeditor.stubs.PipeRun;\r
-import org.simantics.proconf.g3d.base.JmeRenderingComponent;\r
-\r
-import com.jme.renderer.ColorRGBA;\r
-\r
-\r
-// TODO : this class won't work with valueSets\r
-public class ResourcePipeAnimationController extends PipeAnimationController {\r
- Resource color;\r
- Resource velocity;\r
- \r
- ColorRGBA minColor = new ColorRGBA(0.f,0.f,1.f,1.f);\r
- ColorRGBA maxColor = new ColorRGBA(1.f,0.f,0.f,1.f);\r
- ColorRGBA currentColor = new ColorRGBA(1.f,1.f,1.f,1.f);\r
- \r
- double colorMin;\r
- double colorMax;\r
- double iColorRange;\r
- \r
- double velMin;\r
- double velMax;\r
- double iVelRange;\r
- public ResourcePipeAnimationController(JmeRenderingComponent component, PipeRun pipeline, Resource color,double colorMin, double colorMax, Resource velocity, double velMin, double velMax) {\r
- super(component, pipeline);\r
- this.color = color;\r
- this.velocity = velocity;\r
- \r
- this.colorMin = colorMin;\r
- this.colorMax = colorMax;\r
- this.iColorRange = 1.0/(colorMax-colorMin);\r
- this.velMin = velMin;\r
- this.velMax = velMax;\r
- this.iVelRange = 1.0/(velMax-velMin);\r
- }\r
- \r
- private double getVelocity(Graph graph) {\r
- return graph.getScalarDouble(velocity);\r
- //velocity.getDoubleScalarValue();\r
- }\r
- \r
- private double getColor(Graph graph) {\r
- return graph.getScalarDouble(color);\r
- }\r
- public void updateAnimation(Graph g,double frameTime) {\r
- double d = (getVelocity(g)-velMin)*iVelRange;\r
- float f = (float)((getColor(g)-colorMin)*iColorRange);\r
- currentColor.interpolate(minColor, maxColor, f);\r
- for (PipeFlowAnimation a : animatables) {\r
- a.animate(d,frameTime); \r
- //a.getParticleGeometry().setDefaultColor(currentColor);\r
- a.getParticleGeometry().setStartColor(currentColor);\r
- a.getParticleGeometry().setEndColor(currentColor);\r
- }\r
- }\r
- \r
- \r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.common;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.HashMap;\r
-import java.util.Stack;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.Matrix3d;\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Quat4d;\r
-import javax.vecmath.Tuple3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.actions.PositionType;\r
-import org.simantics.processeditor.common.PipingTools2.Direction;\r
-import org.simantics.processeditor.stubs.PipeControlPoint;\r
-import org.simantics.processeditor.stubs.PipeRun;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.MathTools;\r
-import org.simantics.proconf.g3d.base.TransformationTools;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-import org.simantics.utils.datastructures.Pair;\r
-\r
-\r
-public class ControlPointTools {\r
- \r
- private static boolean DEBUG = false;\r
- \r
- private static TransformationTools tt;\r
- \r
- public static void initialize() {\r
- tt = new TransformationTools(ProcessResource.plant3Dresource.HasSubPoint,ProcessResource.plant3Dresource.SubPointOf) {\r
- @Override\r
- public IEntity getParent(IEntity node) {\r
- IEntity parent = super.getParent(node);\r
- if (parent == null) {\r
- parent = node.getAtMostOneRelatedObject(ProcessResource.plant3Dresource.ControlPointOf);\r
- if (parent != null)\r
- parent = parent.getAtMostOneRelatedObject(ProcessResource.g3dResource.HasParent);\r
- else\r
- parent = node.getAtMostOneRelatedObject(ProcessResource.g3dResource.HasParent);\r
- \r
- }\r
- return parent;\r
- }\r
- };\r
- }\r
- \r
- public static void deinitialize() {\r
- tt = null;\r
- }\r
- \r
- /**\r
- * Adds new control point between given control points.\r
- * New pcp must be already part of the same piperun as previous CP and nextCP\r
- * \r
- * SizeChangeControlPoints cannot be inserted with this method, since it does link two different piperuns to each other\r
- * \r
- * @param newCP\r
- * @param previousCP\r
- * @param nextCP\r
- */\r
- public static void insertControlPoint(IEntity newCP, IEntity previousCP, IEntity nextCP) {\r
- // inserting an offsetpoint is error, \r
- assert(!newCP.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint));\r
- // size change control point cannot be inserted this way, because it ends PipeRun\r
- assert(!newCP.isInstanceOf(ProcessResource.plant3Dresource.SizeChangeControlPoint));\r
- \r
- IEntity piperun = previousCP.getSingleRelatedObject(ProcessResource.plant3Dresource.ControlPointOfPipeRun);\r
- // and just to make sure that control point structure is not corrupted\r
- assert(piperun.equals(nextCP.getSingleRelatedObject(ProcessResource.plant3Dresource.ControlPointOfPipeRun)));\r
- assert(piperun.equals(newCP.getSingleRelatedObject(ProcessResource.plant3Dresource.ControlPointOfPipeRun)));\r
- \r
- // insert new BranchControlPoint between straight's control points\r
- IEntity previousNext = previousCP.getAtMostOneRelatedObject(ProcessResource.plant3Dresource.HasNext);\r
- IEntity previousPrevious = previousCP.getAtMostOneRelatedObject(ProcessResource.plant3Dresource.HasPrevious);\r
- \r
- IEntity offsetCP = null;\r
- \r
- if (newCP.isInstanceOf(ProcessResource.plant3Dresource.OffsettingPoint)) {\r
- offsetCP = newCP.getSingleRelatedObject(ProcessResource.plant3Dresource.HasSubPoint);\r
- }\r
- \r
- if (previousNext != null && previousNext.equals(nextCP)) {\r
- assert(!previousCP.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint));\r
- assert(!nextCP.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint));\r
- \r
- setStatement(previousCP, ProcessResource.plant3Dresource.HasNext, newCP);\r
- setStatement(newCP, ProcessResource.plant3Dresource.HasPrevious, previousCP);\r
- \r
- if (previousCP.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint)) { \r
- IEntity sccp = previousCP.getSingleRelatedObject(ProcessResource.plant3Dresource.SubPointOf);\r
- setStatement(sccp, ProcessResource.plant3Dresource.HasNext, newCP);\r
- }\r
- \r
- setStatement(newCP, ProcessResource.plant3Dresource.HasNext, nextCP);\r
- \r
- if (offsetCP == null) {\r
- setStatement(nextCP, ProcessResource.plant3Dresource.HasPrevious, newCP);\r
- } else {\r
- setStatement(nextCP, ProcessResource.plant3Dresource.HasPrevious, offsetCP);\r
- setStatement(offsetCP, ProcessResource.plant3Dresource.HasNext, nextCP);\r
- setStatement(offsetCP, ProcessResource.plant3Dresource.HasPrevious, previousCP);\r
- }\r
- \r
- if (nextCP.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint)) {\r
- IEntity ocp = nextCP.getSingleRelatedObject(ProcessResource.plant3Dresource.HasSubPoint);\r
- setStatement(ocp, ProcessResource.plant3Dresource.HasPrevious, newCP);\r
- }\r
- \r
- } else if (previousPrevious != null && previousPrevious.equals(nextCP)) {\r
- // control point were given in reverse order \r
- assert(!nextCP.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint));\r
- assert(!previousCP.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint));\r
- \r
- setStatement(newCP, ProcessResource.plant3Dresource.HasNext, previousCP);\r
- if (offsetCP == null) {\r
- setStatement(previousCP, ProcessResource.plant3Dresource.HasPrevious, newCP);\r
- } else {\r
- setStatement(previousCP, ProcessResource.plant3Dresource.HasPrevious, offsetCP);\r
- setStatement(offsetCP, ProcessResource.plant3Dresource.HasNext, previousCP);\r
- setStatement(offsetCP, ProcessResource.plant3Dresource.HasPrevious, nextCP);\r
- }\r
- \r
- if (previousCP.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint)) {\r
- IEntity ocp = previousCP.getSingleRelatedObject(ProcessResource.plant3Dresource.HasSubPoint);\r
- setStatement(ocp, ProcessResource.plant3Dresource.HasPrevious, newCP);\r
- }\r
- \r
- setStatement(newCP, ProcessResource.plant3Dresource.HasPrevious, nextCP);\r
- setStatement(nextCP, ProcessResource.plant3Dresource.HasNext, newCP);\r
- if (nextCP.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint)) {\r
- IEntity sccp = nextCP.getSingleRelatedObject(ProcessResource.plant3Dresource.SubPointOf);\r
- setStatement(sccp, ProcessResource.plant3Dresource.HasNext, newCP);\r
- }\r
- } else {\r
- ErrorLogger.defaultLogError(\r
- "Route pipe : could not find connection between straight pipe's control points", null);\r
- }\r
-\r
- }\r
- \r
- /**\r
- * Adds new control point attaching it to given control point.\r
- * If the new control point is SizeChangeControlPoint, it must have its offset point set.\r
- * \r
- * @param newCP\r
- * @param pcp\r
- * @param direction\r
- */\r
- public static void insertControlPoint(IEntity newCP, IEntity pcp, Direction direction) {\r
- assert(!newCP.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint));\r
- if (direction == Direction.NEXT) {\r
- // if direction is next, user must have given OffsetPoint\r
- assert(!pcp.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint));\r
- // basic next/prev links\r
- pcp.removeRelatedStatements(ProcessResource.plant3Dresource.HasNext);\r
- pcp.addStatement(ProcessResource.plant3Dresource.HasNext, newCP);\r
- newCP.removeRelatedStatements(ProcessResource.plant3Dresource.HasPrevious);\r
- newCP.addStatement(ProcessResource.plant3Dresource.HasPrevious, pcp);\r
- // and last take care of sizechange / offset points\r
- if (pcp.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint)) {\r
- IEntity sccp = pcp.getSingleRelatedObject(ProcessResource.plant3Dresource.SubPointOf);\r
- sccp.removeRelatedStatements(ProcessResource.plant3Dresource.HasNext);\r
- sccp.addStatement(ProcessResource.plant3Dresource.HasNext, newCP);\r
- }\r
- if (newCP.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint)) {\r
- IEntity ocp = newCP.getSingleRelatedObject(ProcessResource.plant3Dresource.HasSubPoint);\r
- ocp.removeRelatedStatements(ProcessResource.plant3Dresource.HasPrevious);\r
- ocp.addStatement(ProcessResource.plant3Dresource.HasPrevious, pcp);\r
- }\r
- } else {\r
- // if direction is previous, user must have given sizechange\r
- assert(!pcp.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint));\r
- // previous direction is more complicated, since if newCP is SizeChangeControlPoint,\r
- // we must link pcp to newCP's OffsetPoint\r
- IEntity nocp = null;\r
- if (newCP.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint)) {\r
- nocp = newCP.getSingleRelatedObject(ProcessResource.plant3Dresource.HasSubPoint);\r
- nocp.removeRelatedStatements(ProcessResource.plant3Dresource.HasNext);\r
- nocp.addStatement(ProcessResource.plant3Dresource.HasNext, pcp);\r
- }\r
- pcp.removeRelatedStatements(ProcessResource.plant3Dresource.HasPrevious);\r
- if (nocp == null)\r
- pcp.addStatement(ProcessResource.plant3Dresource.HasPrevious, newCP);\r
- else\r
- pcp.addStatement(ProcessResource.plant3Dresource.HasPrevious, nocp);\r
- \r
- newCP.removeRelatedStatements(ProcessResource.plant3Dresource.HasNext);\r
- newCP.addStatement(ProcessResource.plant3Dresource.HasNext, pcp);\r
- if (pcp.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint)) {\r
- IEntity ocp = pcp.getSingleRelatedObject(ProcessResource.plant3Dresource.HasSubPoint);\r
- ocp.removeRelatedStatements(ProcessResource.plant3Dresource.HasPrevious);\r
- if (nocp == null)\r
- ocp.addStatement(ProcessResource.plant3Dresource.HasPrevious, newCP);\r
- else\r
- ocp.addStatement(ProcessResource.plant3Dresource.HasPrevious, nocp);\r
- }\r
- \r
- }\r
- }\r
- \r
- /**\r
- * Returns path legs direction\r
- * @param pcp\r
- * @param direction\r
- * @return\r
- */\r
- public static Vector3d getPathLegDirection(IEntity pcp,Direction direction) {\r
- IEntity previous = pcp.getAtMostOneRelatedObject(ProcessResource.plant3Dresource.HasPrevious);\r
- IEntity next = pcp.getAtMostOneRelatedObject(ProcessResource.plant3Dresource.HasNext);\r
- if (direction == Direction.NEXT) {\r
- if (next != null) {\r
- if (pcp.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint))\r
- pcp = pcp.getSingleRelatedObject(ProcessResource.plant3Dresource.HasSubPoint);\r
- Point3d p1 = G3DTools.getPoint(pcp.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition));\r
- Point3d p2 = G3DTools.getPoint(next.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition));\r
- Vector3d v = new Vector3d();\r
- v.sub(p2, p1);\r
- return v;\r
- } else {\r
- if (pcp.isInstanceOf(ProcessResource.plant3Dresource.VariableAngleTurnControlPoint))\r
- throw new RuntimeException("Cannot calculate path leg direction for unconnected variable angle control point " + pcp.getResource());\r
- if (previous == null) {\r
- if (!pcp.isInstanceOf(ProcessResource.plant3Dresource.DirectedControlPoint))\r
- throw new RuntimeException("Cannot calculate path leg direction for unconnected control point " + pcp.getResource());\r
- else\r
- return getDirectedControlPointDirection(pcp);\r
- } else {\r
- if (pcp.isInstanceOf(ProcessResource.plant3Dresource.InlineControlPoint)) {\r
- Point3d p1 = G3DTools.getPoint(previous.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition));\r
- Point3d p2 = G3DTools.getPoint(pcp.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition));\r
- Vector3d v = new Vector3d();\r
- v.sub(p2, p1);\r
- return v;\r
- }\r
- throw new RuntimeException("Missing implementation");\r
- }\r
- }\r
- } else {\r
- if (previous != null) {\r
- if (pcp.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint))\r
- pcp = pcp.getSingleRelatedObject(ProcessResource.plant3Dresource.SubPointOf);\r
- Point3d p1 = G3DTools.getPoint(pcp.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition));\r
- Point3d p2 = G3DTools.getPoint(previous.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition));\r
- Vector3d v = new Vector3d();\r
- v.sub(p2, p1);\r
- return v;\r
- } else {\r
- if (pcp.isInstanceOf(ProcessResource.plant3Dresource.VariableAngleTurnControlPoint))\r
- throw new RuntimeException("Cannot calculate path leg direction for unconnected variable angle control point " + pcp.getResource());\r
- if (next == null) {\r
- if (!pcp.isInstanceOf(ProcessResource.plant3Dresource.DirectedControlPoint))\r
- throw new RuntimeException("Cannot calculate path leg direction for unconnected control point " + pcp.getResource());\r
- else {\r
- Vector3d v = getDirectedControlPointDirection(pcp);\r
- v.negate();\r
- return v;\r
- }\r
- } else {\r
- if (pcp.isInstanceOf(ProcessResource.plant3Dresource.InlineControlPoint)) {\r
- Point3d p1 = G3DTools.getPoint(next.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition));\r
- Point3d p2 = G3DTools.getPoint(pcp.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition));\r
- Vector3d v = new Vector3d();\r
- v.sub(p2, p1);\r
- return v;\r
- }\r
- throw new RuntimeException("Missing implementation");\r
- }\r
- }\r
- }\r
- \r
- }\r
- \r
- /**\r
- * Return positions (world) of an InlineComponents ends\r
- * @param pcp\r
- * @param p1\r
- * @param p2\r
- */\r
- public static void getInlineControlPointEnds(IEntity pcp, Point3d p1, Point3d p2) {\r
- assert (pcp.isInstanceOf(ProcessResource.plant3Dresource.InlineControlPoint));\r
- \r
- Point3d pos = G3DTools.getPoint(pcp.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition));\r
- Vector3d dir = ControlPointTools.getPathLegDirection(pcp, Direction.NEXT);\r
- dir.normalize();\r
- double length = pcp.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength);\r
- dir.scale(length * 0.5);\r
- p1.set(pos);\r
- p2.set(pos);\r
- p1.add(dir);\r
- p2.sub(dir);\r
- }\r
- \r
- /**\r
- * Return positions (world) of an InlineComponents ends\r
- * @param pcp\r
- * @param p1\r
- * @param p2\r
- */\r
- public static void getInlineControlPointEnds(IEntity pcp, Point3d p1, Point3d p2, Vector3d dir) {\r
- assert (pcp.isInstanceOf(ProcessResource.plant3Dresource.InlineControlPoint));\r
- \r
- Point3d pos = G3DTools.getPoint(pcp.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition));\r
- dir.set(ControlPointTools.getPathLegDirection(pcp, Direction.NEXT));\r
- double length = pcp.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength);\r
- Vector3d d = new Vector3d(dir);\r
- d.scale(length * 0.5);\r
- p1.set(pos);\r
- p2.set(pos);\r
- p1.add(d);\r
- p2.sub(d);\r
- }\r
- \r
- /**\r
- * Return positions (world) of an InlineComponents ends\r
- * @param pcp\r
- * @param p1\r
- * @param p2\r
- */\r
- public static void getInlineControlPointEnds(IEntity pcp, Point3d center, Point3d p1, Point3d p2, Vector3d dir) {\r
- assert (pcp.isInstanceOf(ProcessResource.plant3Dresource.InlineControlPoint));\r
- \r
- Point3d pos = G3DTools.getPoint(pcp.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition));\r
- center.set(pos);\r
- dir.set(ControlPointTools.getPathLegDirection(pcp, Direction.NEXT));\r
- double length = pcp.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength);\r
- Vector3d d = new Vector3d(dir);\r
- d.scale(length * 0.5);\r
- p1.set(pos);\r
- p2.set(pos);\r
- p1.add(d);\r
- p2.sub(d);\r
- }\r
- \r
- public static double getInlineLength(IEntity pcp) {\r
- double l2 = 0.0;\r
- if (pcp.isInstanceOf(ProcessResource.plant3Dresource.TurnControlPoint)) {\r
- l2 += pcp.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength);\r
- } else if (pcp.isInstanceOf(ProcessResource.plant3Dresource.InlineControlPoint)) {\r
- l2 += pcp.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength) * 0.5;\r
- }\r
- return l2;\r
- }\r
- \r
- /**\r
- * Returns position (world) of a single port\r
- * @param pcp\r
- * @param type\r
- * @return\r
- */\r
- public static Point3d getRealPosition(IEntity pcp, PositionType type) {\r
- PipeControlPoint p= new PipeControlPoint(pcp);\r
- Point3d pos = G3DTools.getPoint(p.getWorldPosition());\r
- switch (type) {\r
- case NEXT: {\r
- Vector3d dir = ControlPointTools.getPathLegDirection(pcp,Direction.NEXT);\r
- double length = getInlineLength(pcp);\r
- dir.normalize();\r
- dir.scale(length);\r
- pos.add(dir);\r
- break;\r
- }\r
- case PREVIOUS: {\r
- Vector3d dir = ControlPointTools.getPathLegDirection(pcp,Direction.PREVIOUS);\r
- double length = getInlineLength(pcp);\r
- dir.normalize();\r
- dir.scale(length);\r
- pos.add(dir);\r
- break;\r
- }\r
- case PORT:\r
- // IEntity portDir = pcp.getSingleRelatedObject(ProcessResource.plant3Dresource.HasDirection);\r
- // TODO : how we calculated needed space for a port; does it has an offset from control point's position or not?\r
- break;\r
- case SPLIT:\r
- // do nothing\r
- break;\r
- \r
- }\r
- return pos;\r
- }\r
- \r
- public static void getInlineMovement(PipeControlPoint pcp, Point3d start, Point3d end) {\r
- // FIXME : check type of neighbor components and allow movement on top of variable length components,\r
- // ffind proper range for movement (pcp's position is not)\r
- PipeControlPoint prev = pcp.getPrevious().getPrevious();\r
- PipeControlPoint next = pcp.getNext().getNext();\r
- start.set(G3DTools.getPoint(prev.getWorldPosition()));\r
- end.set(G3DTools.getPoint(next.getWorldPosition()));\r
- }\r
- \r
- public static AxisAngle4d getControlPointLocalRotation(IEntity pcp, double angle) {\r
- Quat4d q1 = getControlPointLocalOrientationQuat(pcp, angle);\r
- AxisAngle4d aa= new AxisAngle4d();\r
- aa.set(q1);\r
- return aa;\r
- }\r
- \r
- public static AxisAngle4d getControlPointWorldRotation(IEntity pcp, double angle) {\r
- Quat4d q1 = getControlPointWorldOrientationQuat(pcp, angle);\r
- AxisAngle4d aa= new AxisAngle4d();\r
- aa.set(q1);\r
- return aa;\r
- }\r
- \r
-\r
- public static Quat4d getControlPointLocalOrientationQuat(IEntity pcp, double angle) {\r
- return getControlPointLocalOrientationQuat(pcp, angle, false);\r
- }\r
- \r
- public static Quat4d getControlPointWorldOrientationQuat(IEntity pcp, double angle) {\r
- return getControlPointWorldOrientationQuat(pcp, angle, false);\r
- }\r
- \r
- public static Quat4d getControlPointLocalOrientationQuat(IEntity cp, double angle, boolean offset) {\r
- PipeControlPoint pcp = new PipeControlPoint(cp);\r
- PipeControlPoint next;\r
- // if pcp is size change control point with offset, next control point is not in line with previous and pcp control point (it's offsetted)\r
- // else it's more numerically stable to use next control point\r
- if (offset)\r
- next = pcp;\r
- else\r
- next = pcp.getNext();\r
- \r
- PipeControlPoint prev = pcp.getPrevious();\r
- assert (next != null || prev != null);\r
- if (prev == null)\r
- prev = pcp;\r
- else if (next == null)\r
- next = pcp;\r
- // TODO : check correct type\r
- if (pcp.isInstanceOf(ProcessResource.plant3Dresource.PathLegEndControlPoint) && pcp.getPrevious() == null) {\r
- PipeControlPoint temp = next;\r
- next = prev;\r
- prev = temp;\r
- }\r
- Vector3d current = new Vector3d(G3DTools.getPoint(next.getLocalPosition()));\r
- current.sub(G3DTools.getPoint(prev.getLocalPosition()));\r
- current.normalize();\r
- return getControlPointOrientationQuat(current, angle);\r
- }\r
- \r
- public static Quat4d getControlPointWorldOrientationQuat(IEntity cp, double angle, boolean offset) {\r
- PipeControlPoint pcp = new PipeControlPoint(cp);\r
- PipeControlPoint next;\r
- // if pcp is size change control point with offset, next control point is not in line with previous and pcp control point (it's offsetted)\r
- // else it's more numerically stable to use next control point\r
- if (offset)\r
- next = pcp;\r
- else\r
- next = pcp.getNext();\r
- \r
- PipeControlPoint prev = pcp.getPrevious();\r
- assert (next != null || prev != null);\r
- if (prev == null)\r
- prev = pcp;\r
- else if (next == null)\r
- next = pcp;\r
- // TODO : check correct type\r
- if (pcp.isInstanceOf(ProcessResource.plant3Dresource.PathLegEndControlPoint) && pcp.getPrevious() == null) {\r
- PipeControlPoint temp = next;\r
- next = prev;\r
- prev = temp;\r
- }\r
- Vector3d current = new Vector3d(G3DTools.getPoint(next.getWorldPosition()));\r
- current.sub(G3DTools.getPoint(prev.getWorldPosition()));\r
- current.normalize();\r
- return getControlPointOrientationQuat(current, angle);\r
- }\r
- \r
- public static Quat4d getControlPointOrientationQuat(Vector3d dir, double angle) {\r
-\r
- \r
- final Vector3d front = new Vector3d(1.0,0.0,0.0);\r
- \r
- Quat4d q1 = new Quat4d();\r
-\r
- Vector3d up = new Vector3d(0.0, 1.0, 0.0);\r
- double a = up.angle(dir);\r
- if (a < 0.1 || (Math.PI - a) < 0.1) {\r
- up.set(1.0, 0.0, 0.0);\r
- }\r
-\r
- Vector3d right = new Vector3d();\r
-\r
- right.cross(dir, up);\r
- up.cross(right, dir);\r
- right.normalize();\r
- up.normalize();\r
-\r
- Matrix3d m = new Matrix3d();\r
- m.m00 = dir.x;\r
- m.m10 = dir.y;\r
- m.m20 = dir.z;\r
- m.m01 = up.x;\r
- m.m11 = up.y;\r
- m.m21 = up.z;\r
- m.m02 = right.x;\r
- m.m12 = right.y;\r
- m.m22 = right.z;\r
-\r
- //q1.set(m); MathTools contains more stable conversion\r
- MathTools.getQuat(m, q1);\r
-\r
- if (DEBUG) System.out.println("PipingTools.getPipeComponentOrientationQuat() " + dir+ " " + up + " " + right);\r
-\r
- Quat4d q2 = new Quat4d();\r
- q2.set(new AxisAngle4d(front, angle));\r
- q1.mul(q2);\r
- return q1;\r
- }\r
- \r
- public static PipeControlPoint findPreviousEnd(PipeControlPoint tcp) {\r
- // TODO : optimize (we do not need the list here)\r
- ArrayList<PipeControlPoint> t = new ArrayList<PipeControlPoint>();\r
- return findPreviousEnd(tcp, t);\r
- }\r
- \r
- public static PipeControlPoint findNextEnd(PipeControlPoint tcp) {\r
- // TODO : optimize (we do not need the list here)\r
- ArrayList<PipeControlPoint> t = new ArrayList<PipeControlPoint>();\r
- return findNextEnd(tcp, t);\r
- }\r
- \r
- /**\r
- * Returns pipe leg's end using "nextControlPoint" relation and collects control point in the given list. \r
- * @param tcp\r
- * @param nextList\r
- * @return\r
- */\r
- public static PipeControlPoint findNextEnd(PipeControlPoint tcp, ArrayList<PipeControlPoint> nextList) {\r
- if (DEBUG) System.out.print("PipingTools.findNextEnd " + tcp.getResource());\r
- while (true) {\r
- PipeControlPoint pcp = null;\r
- PipeControlPoint p = null;\r
- if (nextList.size() == 0)\r
- p = tcp;\r
- \r
- else\r
- p = nextList.get(nextList.size() - 1);\r
-\r
- pcp = p.getNext();\r
- if (pcp == null) {\r
- pcp = p;\r
- if (nextList.size() > 0)\r
- nextList.remove(nextList.size() - 1);\r
- if (DEBUG) System.out.println(" " + pcp.getResource() + " not full");\r
- return pcp;\r
- //break;\r
- }\r
- if (pcp.isInstanceOf(ProcessResource.plant3Dresource.PathLegEndControlPoint)) {\r
- if (DEBUG) System.out.println(" " + pcp.getResource());\r
- return pcp;\r
- } else {\r
- nextList.add(pcp);\r
- if (DEBUG) System.out.print(" " + pcp.getResource());\r
- }\r
- }\r
- }\r
- \r
- \r
- \r
- /**\r
- * Returns pipe leg's end using "previousControlPoint" relation and collects control point in the given list.\r
- * @param tcp\r
- * @param prevList\r
- * @return\r
- */\r
- public static PipeControlPoint findPreviousEnd(PipeControlPoint tcp, ArrayList<PipeControlPoint> prevList) {\r
- if (DEBUG) System.out.print("PipingTools.findPreviousEnd " + tcp.getResource());\r
- while (true) {\r
- PipeControlPoint pcp = null;\r
- PipeControlPoint p = null;\r
- if (prevList.size() == 0)\r
- p = tcp;\r
- \r
- else\r
- p = prevList.get(prevList.size() - 1);\r
-\r
- pcp = p.getPrevious();\r
- if (pcp == null) {\r
- pcp = p;\r
- if (prevList.size() > 0)\r
- prevList.remove(prevList.size() - 1);\r
- if (DEBUG) System.out.println(" " + pcp.getResource() + " not full");\r
- return pcp;\r
- }\r
- if (pcp.isInstanceOf(ProcessResource.plant3Dresource.PathLegEndControlPoint)) {\r
- if (DEBUG) System.out.println(" " + pcp.getResource());\r
- return pcp;\r
- } else {\r
- prevList.add(pcp);\r
- if (DEBUG) System.out.print(" " + pcp.getResource());\r
- }\r
- }\r
- }\r
- \r
- public static PipeRun getPipeRun(PipeControlPoint pcp) {\r
- return pcp.getControlPointOfPipeRun();\r
- }\r
- \r
- @Deprecated\r
- public static Vector3d getSizeChangeOffsetVector(PipeControlPoint sccp) {\r
- Quat4d q = getControlPointWorldOrientationQuat(sccp, sccp.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasRotationAngle),true);\r
- return getSizeChangeOffsetVector(sccp,q);\r
- }\r
- \r
- public static Vector3d getSizeChangeOffsetVector(PipeControlPoint sccp, Vector3d dir) {\r
- Quat4d q = getControlPointOrientationQuat(dir, sccp.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasRotationAngle));\r
- return getSizeChangeOffsetVector(sccp,q);\r
- }\r
- \r
- public static Vector3d getSizeChangeOffsetVector(PipeControlPoint sccp, Quat4d q) {\r
- Vector3d v = new Vector3d(0.0,0.0,sccp.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasOffset));\r
- Vector3d offset = new Vector3d();\r
- MathTools.rotate(q, v, offset);\r
- return offset;\r
- }\r
- \r
- public static Vector3d getDirectedControlPointDirection(IEntity dcp) {\r
- assert(dcp.isInstanceOf(ProcessResource.plant3Dresource.DirectedControlPoint));\r
- AxisAngle4d worldR = G3DTools.getOrientation(dcp.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldOrientation));\r
- Quat4d q = new Quat4d();\r
- q.set(worldR);\r
- Vector3d dir = new Vector3d();\r
- MathTools.rotate(q, new Vector3d(1.0, 0.0, 0.0), dir);\r
- dir.normalize();\r
- return dir;\r
- }\r
- \r
- public static Vector3d getNozzleDirection(IEntity rotation) {\r
- AxisAngle4d worldR = G3DTools.getOrientation(rotation);\r
- Quat4d q = new Quat4d();\r
- q.set(worldR);\r
- Vector3d dir = new Vector3d();\r
- MathTools.rotate(q, new Vector3d(1.0, 0.0, 0.0), dir);\r
- return dir;\r
- }\r
- \r
- public static Vector3d getNozzleDirection(PipeControlPoint dcp) {\r
- return getNozzleDirection(dcp.getWorldOrientation());\r
- }\r
-\r
- public static void removeControlPoint(PipeControlPoint removed) {\r
- if (DEBUG) System.out.println("PipingTools.removeControlPoint() controlpoint " + removed.getResource());//FIXME : offset + size change control points !\r
- \r
- // this code is not valid anymore.\r
- \r
- // different removing cases:\r
- //\r
- // 1. Point is SizeChangeControlPoint (this is currently ok)\r
- // * remove offset point and component \r
- // * do NOT link components together\r
- //\r
- // 2. Point is VariableLength\r
- // * check if its a branch (TODO : ontology support?)\r
- // * if so, also branch point in the other piperun may have to be removed\r
- // (we cannot move other components next to branch)\r
- // * if not, components next to removed one are moved next to each other\r
- // 3. Other\r
- // * check if there is VariableLength on both sides,\r
- // * if so, those must be unified to a single Variable Length component.\r
- // * if not, components must be moved next to each other\r
- //\r
- // a) If removed Control Point is next to Nozzle and after the point is removed nozzle is not connected to anything\r
- // * nozzle's link to piperun's specs must be removed\r
- // \r
- \r
- \r
- if (removed.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint)||\r
- removed.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint)) {\r
- // sccp & ocp connect two pipeRuns to each other; when thoes are remove, pipeRuns are not connected to each other anymore.\r
- removeDualPoint(removed);\r
- return;\r
- } else {\r
- PipeControlPoint prev = removed.getPrevious();\r
- PipeControlPoint next = removed.getNext();\r
- PipeRun pipeRun = getPipeRun(removed);\r
- if (pipeRun == null)\r
- return;\r
- if (next == null && prev == null) {\r
- if (removed.isInstanceOf(ProcessResource.plant3Dresource.NozzleControlPoint)) {\r
- // Nozzle's control point does not need to be removed, only unlinked\r
- // TODO : what about component ports?\r
- PipingTools2.unlinkNozzleAndPiperun(removed.getSingleRelatedObject(ProcessResource.plant3Dresource.ControlPointOf), ControlPointTools.getPipeRun(removed));\r
- return;\r
- }\r
- } else {\r
-\r
- if (next != null && prev != null) {\r
- boolean link = true;\r
- if (next.isInstanceOf(ProcessResource.plant3Dresource.BranchEndControlPoint)){\r
- link = false;\r
- next.removeRelatedStatements(ProcessResource.plant3Dresource.HasPrevious);\r
- removed.removeRelatedStatements(ProcessResource.plant3Dresource.HasNext);\r
- removeControlPoint(next);\r
- }\r
- if (prev.isInstanceOf(ProcessResource.plant3Dresource.BranchEndControlPoint)) {\r
- link = false;\r
- prev.removeRelatedStatements(ProcessResource.plant3Dresource.HasNext);\r
- removed.removeRelatedStatements(ProcessResource.plant3Dresource.HasPrevious);\r
- removeControlPoint(prev);\r
- }\r
- if (link && prev.isInstanceOf(ProcessResource.plant3Dresource.DirectedControlPoint)&&\r
- next.isInstanceOf(ProcessResource.plant3Dresource.DirectedControlPoint)) {\r
- link = false;\r
- }\r
- if (next.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint)) {\r
- PipeControlPoint sccp = next;\r
- PipeControlPoint ocp = sccp.getSubPoint().iterator().next();\r
- if (ocp == null) {\r
- ErrorLogger.defaultLogError("Removing PipeControlPoint " + removed.getResource()+ " structure damaged, no offset control point",null);\r
- return;\r
- }\r
- if (link) {\r
- sccp.setPrevious(prev);\r
- ocp.setPrevious(prev);\r
- } else {\r
- sccp.removeRelatedStatements(ProcessResource.plant3Dresource.HasPrevious);\r
- ocp.removeRelatedStatements(ProcessResource.plant3Dresource.HasPrevious);\r
- \r
- }\r
- removed.removeRelatedStatements(ProcessResource.plant3Dresource.HasNext);\r
- } else if (next.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint)) {\r
- ErrorLogger.defaultLogError("Removing PipeControlPoint " + removed.getResource()+ " structure damaged, next control point is offset control point",null);\r
- return;\r
- } else if (next.getPrevious().getResource().equals(removed.getResource())) {\r
- if (link) {\r
- next.setPrevious(prev);\r
- } else {\r
- next.removeRelatedStatements(ProcessResource.plant3Dresource.HasPrevious);\r
- }\r
- removed.removeRelatedStatements(ProcessResource.plant3Dresource.HasNext);\r
- } else {\r
- ErrorLogger.defaultLogError("Removing PipeControlPoint "+ removed.getResource()+ " structure damaged", null);\r
- return;\r
- }\r
- if (prev.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint)) {\r
- ErrorLogger.defaultLogError("Removing PipeControlPoint " + removed.getResource() + " structure damaged, previous control point is size change control point", null);\r
- return;\r
- } else if (prev.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint)) {\r
- PipeControlPoint ocp = prev;\r
- PipeControlPoint sccp = ocp.getSubPointOf();\r
- if (sccp == null) {\r
- ErrorLogger.defaultLogError("Removing PipeControlPoint " + removed.getResource() + " structure damaged, no size change control point",null);\r
- return;\r
- }\r
- if (link) {\r
- ocp.setNext(next);\r
- sccp.setNext(next);\r
- } else {\r
- ocp.removeRelatedStatements(ProcessResource.plant3Dresource.HasNext);\r
- sccp.removeRelatedStatements(ProcessResource.plant3Dresource.HasNext);\r
- }\r
- removed.removeRelatedStatements(ProcessResource.plant3Dresource.HasPrevious);\r
- } else if (prev.getNext().getResource().equals(removed.getResource())) {\r
- if (link)\r
- prev.setNext(next);\r
- else\r
- prev.removeRelatedStatements(ProcessResource.plant3Dresource.HasNext);\r
- removed.removeRelatedStatements(ProcessResource.plant3Dresource.HasPrevious);\r
- } else {\r
- ErrorLogger.defaultLogError("Removing PipeControlPoint " + removed.getResource() + " structure damaged", null);\r
- return;\r
- }\r
- if (link) {\r
- if (next.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthControlPoint) &&\r
- prev.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthControlPoint)) {\r
- // we have to join them into single variable length component.\r
- removeControlPoint(prev);\r
- }\r
- }\r
-\r
- \r
- } else if (next != null) {\r
- if (next.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint)) {\r
- PipeControlPoint sccp = next;\r
- PipeControlPoint ocp = sccp.getSubPoint().iterator().next();\r
- if (ocp == null) {\r
- ErrorLogger.defaultLogError("Removing PipeControlPoint "+ removed.getResource()+ " structure damaged, no offset control point",null);\r
- return;\r
- }\r
- next.removeRelatedStatements(ProcessResource.plant3Dresource.HasPrevious);\r
- ocp.removeRelatedStatements(ProcessResource.plant3Dresource.HasPrevious);\r
- } else if (next.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint)) {\r
- ErrorLogger.defaultLogError("Removing PipeControlPoint " + removed.getResource() + " structure damaged, next control point is offset control point", null);\r
- return;\r
- } else if (next.getPrevious().getResource().equals(removed.getResource())) {\r
- next.removeRelatedStatements(ProcessResource.plant3Dresource.HasPrevious);\r
- } else {\r
- ErrorLogger.defaultLogError("Removing PipeControlPoint " + removed.getResource() + " structure damaged", null);\r
- return;\r
- }\r
- removed.removeRelatedStatements(ProcessResource.plant3Dresource.HasNext);\r
- } else { //(prev != null)\r
- if (prev.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint)) {\r
- ErrorLogger.defaultLogError("Removing PipeControlPoint " + removed.getResource() + " structure damaged, previous control point is size change control point", null);\r
- return;\r
- } else if (prev.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint)) {\r
- PipeControlPoint ocp = prev;\r
- PipeControlPoint sccp = ocp.getSubPointOf();\r
- if (sccp == null) {\r
- ErrorLogger.defaultLogError("Removing PipeControlPoint " + removed.getResource() + " structure damaged, no size change control point", null);\r
- return;\r
- }\r
- prev.removeRelatedStatements(ProcessResource.plant3Dresource.HasNext);\r
- sccp.removeRelatedStatements(ProcessResource.plant3Dresource.HasNext);\r
- } else if (prev.getNext().getResource().equals(removed.getResource())) {\r
- prev.removeRelatedStatements(ProcessResource.plant3Dresource.HasNext);\r
- } else {\r
- ErrorLogger.defaultLogError("Removing PipeControlPoint "+ removed.getResource() + " structure damaged", null);\r
- return;\r
- }\r
- removed.removeRelatedStatements(ProcessResource.plant3Dresource.HasPrevious);\r
- }\r
-\r
- }\r
- if (removed.getSubPoint().size() > 0 ) {\r
- removeSubPoints(removed);\r
- } else if (removed.getSubPointOf() != null) {\r
- removeParentPoint(removed);\r
- }\r
- \r
- removeComponents(removed);\r
- \r
- pipeRun.removeStatement(ProcessResource.plant3Dresource.HasControlPoints, removed);\r
- if (pipeRun.getChild().size() == 0) {\r
- PipingTools2.removePipeRun(pipeRun);\r
- } \r
- else if (pipeRun.getControlPoints().size() == 1) {\r
- removeControlPoint(pipeRun.getControlPoints().iterator().next());\r
- }\r
- }\r
- \r
- }\r
- \r
- private static void removeDualPoint(PipeControlPoint removed) {\r
- PipeControlPoint prev = removed.getPrevious();\r
- PipeControlPoint next = removed.getNext();\r
- if (prev != null) {\r
- prev.removeRelatedStatements(ProcessResource.plant3Dresource.HasNext);\r
- }\r
- if (next != null)\r
- next.removeRelatedStatements(ProcessResource.plant3Dresource.HasPrevious);\r
- PipeControlPoint ocp;\r
- PipeControlPoint sccp;\r
- // get sccp / ocp pair\r
- if (removed.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint)) {\r
- sccp = removed;\r
- ocp = sccp.getSubPoint().iterator().next();\r
- \r
- } else {\r
- ocp = removed;\r
- sccp = ocp.getSubPointOf();\r
- }\r
- PipeRun p1 = getPipeRun(ocp);\r
- PipeRun p2 = getPipeRun(sccp);\r
- \r
- // removes all components connected to control point\r
- \r
- removeComponents(ocp);\r
- \r
- removeComponents(sccp); \r
- \r
- // remove control points from pipeRuns\r
- p1.removeStatement(ProcessResource.plant3Dresource.HasControlPoints, ocp);\r
- p2.removeStatement(ProcessResource.plant3Dresource.HasControlPoints, sccp);\r
-\r
- // remove links to other control points\r
- ocp.removeRelatedStatements(ProcessResource.plant3Dresource.HasNext);\r
- sccp.removeRelatedStatements(ProcessResource.plant3Dresource.HasNext); \r
- ocp.removeRelatedStatements(ProcessResource.plant3Dresource.HasPrevious);\r
- sccp.removeRelatedStatements(ProcessResource.plant3Dresource.HasPrevious); \r
- \r
- // if pipeRuns contains no other components(control points), they can be removed too.\r
- if (p1.getControlPoints().size() == 0) {\r
- PipingTools2.removePipeRun(p1);\r
- } else if (p1.getControlPoints().size() == 1) {\r
- removeControlPoint(p1.getControlPoints().iterator().next());\r
- }\r
- if (p2.getControlPoints().size() == 0) {\r
- PipingTools2.removePipeRun(p2);\r
- } else if (p2.getControlPoints().size() == 1) {\r
- removeControlPoint(p2.getControlPoints().iterator().next());\r
- }\r
- }\r
- \r
- /**\r
- * Removes sub points of a point\r
- * @param removed\r
- * @throws TransactionException\r
- */\r
- private static void removeSubPoints(PipeControlPoint removed) {\r
- // if control point is branch control point, all branch of points must be removed too\r
- Collection<PipeControlPoint> points = removed.getSubPoint();\r
- \r
- for (PipeControlPoint p : points) {\r
- removed.removeStatement(ProcessResource.plant3Dresource.HasSubPoint, p);\r
- removeControlPoint(p);\r
- }\r
- }\r
- \r
- /**\r
- * Removed point is a subpoint of something, \r
- * @param removed\r
- */\r
- private static void removeParentPoint(PipeControlPoint removed) {\r
- throw new RuntimeException("Subpoints cannot be removed");\r
- \r
- // if control point is branch it has to be removed from branch control point\r
-// BranchEndControlPoint ecp = BranchEndControlPointFactory.create(removed);\r
-// BranchControlPoint bcp = null;\r
-// if (ecp.getBranchOfPointSet().size() == 1) {\r
-// bcp = ecp.getBranchOfPointSet().iterator().next();\r
-// }\r
-// if (bcp != null) {\r
-// bcp.getBranchPointSet().remove(ecp);\r
-// if (bcp.getBranchPointSet().size() == 0) {\r
-// // branch control point is not used and can be removed\r
-// removeControlPoint(bcp);\r
-// }\r
-// }\r
- }\r
- \r
- \r
- private static void removeComponents(PipeControlPoint pcp) {\r
- IEntity component = pcp.getControlPointOf();\r
- if (component != null) {\r
- PipeRun p1 = getPipeRun(pcp);\r
- p1.removeStatement(ProcessResource.g3dResource.HasChild, component);\r
- component.removeRelatedStatements(ProcessResource.plant3Dresource.HasControlPoint);\r
- }\r
- }\r
- \r
- private static void setStatement(IEntity subject, Resource relation, IEntity object) {\r
- subject.removeRelatedStatements(relation);\r
- subject.addStatement(relation, object);\r
- }\r
- \r
- \r
- public static void setWorldPosition(IEntity pcp, Tuple3d position) {\r
- IEntity wp = pcp.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition);\r
- G3DTools.setTuple3(wp, position);\r
- tt.propagateWorldTransformChange(tt.getParent(pcp), pcp);\r
- \r
- }\r
- \r
- public static void setLocalPosition(IEntity pcp, Tuple3d position) {\r
- G3DTools.setTuple3(pcp.getSingleRelatedObject(ProcessResource.g3dResource.HasLocalPosition), position);\r
- tt.propagateLocalTransformChange(tt.getParent(pcp), pcp);\r
- }\r
- \r
- public static void setWorldOrientation(IEntity node, AxisAngle4d orientation) {\r
- G3DTools.setOrientation(node.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldOrientation), orientation);\r
- tt.propagateWorldTransformChange(tt.getParent(node), node);\r
- \r
- }\r
- \r
- public static void setLocalOrientation(IEntity node, AxisAngle4d orientation) {\r
- G3DTools.setOrientation(node.getSingleRelatedObject(ProcessResource.g3dResource.HasLocalOrientation), orientation);\r
- tt.propagateLocalTransformChange(tt.getParent(node), node);\r
- }\r
- \r
- private static boolean updatePosition(IEntity pcp) {\r
- return tt.transformationUpdate(pcp);\r
- \r
- \r
- // TODO : orientation is also needed, current code handles only position\r
- // TODO : reuse the code in G3DTools!\r
- /*\r
- IEntity worldPosition = pcp.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition);\r
- IEntity localPosition = pcp.getSingleRelatedObject(ProcessResource.g3dResource.HasLocalPosition);\r
- \r
- \r
- Tuple3d worldP = G3DTools.getPoint(worldPosition);\r
- Tuple3d localP = G3DTools.getPoint(localPosition);\r
-\r
- if (localP == null || worldP == null)\r
- return false;\r
- if (!isValid(worldP) && !isValid(localP))\r
- return false;\r
-\r
- Tuple3d cachedWorldP = (Tuple3d) getProperty(worldPosition.getResource());\r
- Tuple3d cachedLocalP = (Tuple3d) getProperty(localPosition.getResource());\r
-\r
- if (DEBUG) System.out.println("PipeControlPoint changed " + worldP + " " + cachedWorldP + " " + localP + " " + cachedLocalP);\r
- boolean changed = false;\r
-\r
- IEntity parent = pcp.getSingleRelatedObject(ProcessResource.plant3Dresource.ControlPointOf);\r
- \r
- if (parent == null) {\r
- if (DEBUG) System.out.println("PipeControlPoint changed, no parent node");\r
- return false;\r
- }\r
-\r
- if (cachedLocalP == null) {\r
- storeProperty(localPosition.getResource(), localP);\r
- Tuple3d p = G3DTools.getWorldFromLocal(parent, new Point3d(localP)); \r
- storeProperty(worldPosition.getResource(), p);\r
- G3DTools.setTuple3(worldPosition, p);\r
- if (DEBUG) System.out.println("PipeControlPoint changed local " + worldP + " " + p);\r
- changed = true;\r
- } else {\r
- if (TransformationTools.changed(cachedLocalP, localP)) {\r
- storeProperty(localPosition.getResource(), localP);\r
- Tuple3d p = G3DTools.getWorldFromLocal(parent, new Point3d(localP));\r
- storeProperty(worldPosition.getResource(), p);\r
- G3DTools.setTuple3(worldPosition, p);\r
- if (DEBUG) System.out.println("PipeControlPoint changed local " + worldP + " " + localP);\r
- changed = true;\r
- }\r
- if (cachedWorldP == null) {\r
- storeProperty(worldPosition.getResource(), worldP);\r
- Tuple3d p = G3DTools.getLocalFromWorld(parent, new Point3d(worldP));\r
- G3DTools.setTuple3(localPosition, p);\r
- storeProperty(localPosition.getResource(), p);\r
- if (DEBUG) System.out.println("PipeControlPoint changed world " + worldP + " " + p);\r
- changed = true;\r
- } else {\r
- if (TransformationTools.changed(cachedWorldP, worldP)) {\r
- storeProperty(worldPosition.getResource(), worldP);\r
- Tuple3d p = G3DTools.getLocalFromWorld(parent, new Point3d(worldP));\r
- G3DTools.setTuple3(localPosition, p);\r
- storeProperty(localPosition.getResource(), p);\r
- if (DEBUG) System.out.println("PipeControlPoint changed world " + worldP + " " + p);\r
- changed = true;\r
- }\r
- }\r
- }\r
- return changed;\r
- //*/\r
- }\r
- \r
- static boolean isControlPointChanged(PipeControlPoint node) {\r
-\r
- long id = node.getResource().getResourceId();\r
- \r
- boolean changed = updatePosition(node);\r
- //if (!changed) {\r
- if (node.isInstanceOf(ProcessResource.plant3Dresource.PathLegEndControlPoint)) {\r
- if (node.isInstanceOf(ProcessResource.plant3Dresource.TurnControlPoint)) {\r
- Pair<Long,Long> connected = (Pair<Long,Long>)getProperty(node.getResource().getResourceId());\r
- PipeControlPoint next = node.getNext();\r
- PipeControlPoint prev = node.getPrevious();\r
- if ((next != null && prev != null) && (\r
- connected == null || \r
- (connected.first == null && prev != null) ||\r
- (connected.second == null && next != null) ||\r
- !connected.first.equals(prev.getResource().getResourceId()) ||\r
- !connected.second.equals(next.getResource().getResourceId()))) {\r
- storeProperty(id, new Pair<Long,Long>(prev.getResource().getResourceId(),next.getResource().getResourceId()));\r
- changed = true; \r
- }\r
- if (node.isInstanceOf(ProcessResource.plant3Dresource.VariableAngleTurnControlPoint)) {\r
- double r = node.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasTurnRadius);\r
- Double d = (Double)getProperty(id + ":turnradius");\r
- if (d == null || TransformationTools.changed(r, d)) {\r
- storeProperty(id + ":turnradius", r);\r
- changed = true;\r
- }\r
- }\r
- }\r
- else if (node.isInstanceOf(ProcessResource.plant3Dresource.DirectedControlPoint)) {\r
- Vector3d dir = ControlPointTools.getDirectedControlPointDirection(node);\r
- Vector3d old = (Vector3d)getProperty(id + ":direction");\r
- if (old == null || TransformationTools.changed(dir, old)) {\r
- storeProperty(id + ":direction", dir);\r
- changed = true;\r
- }\r
- }\r
- } else { // InlineControlPoint\r
- if (node.isInstanceOf(ProcessResource.plant3Dresource.FixedLengthControlPoint)) {\r
- double length = node.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength);\r
- Double d = (Double)getProperty(id + ":length");\r
- if (d == null)\r
- changed = true;\r
- else\r
- changed = changed || TransformationTools.changed(length, d);\r
- \r
- if (changed) {\r
- storeProperty(id + ":length", length);\r
- return true;\r
- }\r
- } else \r
- if (node.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint)) {\r
- \r
- double angle = node.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasRotationAngle);\r
- Double d = (Double)getProperty(id + ":rotationangle");\r
- if (d == null)\r
- changed = true;\r
- else\r
- changed = changed || TransformationTools.changed(angle, d);\r
- if (changed) {\r
- storeProperty(id + ":rotationangle", angle);\r
- return true;\r
- }\r
- Collection<PipeControlPoint> subpoints = node.getSubPoint();\r
- if (subpoints.size() != 1)\r
- throw new RuntimeException("Current implementation assumes that size change components are dual conmnected");\r
- PipeControlPoint ocp = subpoints.iterator().next();\r
- if (node.isInstanceOf(ProcessResource.plant3Dresource.OffsettingPoint)) {\r
- double offset = ocp.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasOffset);\r
- d = (Double)getProperty(id +":offset");\r
- if (d == null)\r
- changed = true;\r
- else\r
- changed = TransformationTools.changed(offset, d);\r
- if (changed) {\r
- storeProperty(id+":offset", offset);\r
- return true;\r
- }\r
- }\r
-// } else if (node instanceof OffsetControlPoint) {\r
-// OffsetControlPoint ocp = (OffsetControlPoint)node;\r
-// //ocp.\r
-// } else if (node instanceof BranchControlPoint) {\r
-// BranchControlPoint bcp = (BranchControlPoint)node;\r
-// int size = bcp.getBranchPointSet().size();\r
-// Integer i = (Integer)getProperty(bcp.getResource().getId());\r
-// if (i == null)\r
-// changed =true;\r
-// else\r
-// changed = changed || i != size;\r
-// if (changed) {\r
-// storeProperty(bcp.getResource().getId(), size);\r
-// return true;\r
-// }\r
- }\r
- }\r
- //}\r
- \r
- return changed;\r
- }\r
- \r
- private static boolean isValid(Tuple3d v) {\r
- if (Double.isInfinite(v.x) || \r
- Double.isNaN(v.x) ||\r
- Double.isInfinite(v.y) || \r
- Double.isNaN(v.y) ||\r
- Double.isInfinite(v.z) || \r
- Double.isNaN(v.z))\r
- return false;\r
- return true;\r
- }\r
- \r
- private static HashMap<Object, Object> properties = new HashMap<Object, Object>();\r
- \r
- public static Object getProperty(Object key) {\r
- return properties.get(key);\r
- }\r
- \r
- public static void storeProperty(Object key, Object value) {\r
- properties.put(key, value);\r
- }\r
- \r
- /**\r
- * Loads positions of controlpoint to rule cache\r
- * \r
- * TODO : this caches only transformation information : other info must be cached too\r
- * \r
- * @param root resource of the modeled plant\r
- */\r
- public static void reloadCache(Graph graph, Resource root) {\r
- \r
- Stack<IEntity> stack = new Stack<IEntity>();\r
- stack.add(EntityFactory.create(graph,root));\r
- while (!stack.isEmpty()) {\r
- IEntity current = stack.pop();\r
- IEntity pcp = current.getAtMostOneRelatedObject(ProcessResource.plant3Dresource.HasControlPoint);\r
- if (pcp == null) {\r
- stack.addAll(current.getRelatedObjects(ProcessResource.g3dResource.HasChild));\r
- } else {\r
- if (DEBUG) System.out.println("Cached pcp " + pcp.getResource());\r
- IEntity localPos = pcp.getSingleRelatedObject(ProcessResource.g3dResource.HasLocalPosition);\r
- IEntity worldPos = pcp.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition);\r
- \r
- tt.storeProperty(localPos.getResource(),G3DTools.getPoint(localPos));\r
- tt.storeProperty(worldPos.getResource(),G3DTools.getPoint(worldPos));\r
- \r
- IEntity localOr = pcp.getAtMostOneRelatedObject(ProcessResource.g3dResource.HasLocalOrientation);\r
- IEntity worldOr = pcp.getAtMostOneRelatedObject(ProcessResource.g3dResource.HasWorldOrientation);\r
- \r
- if (worldOr != null) {\r
- tt.storeProperty(localOr.getResource(),G3DTools.getOrientation(localOr));\r
- tt.storeProperty(worldOr.getResource(),G3DTools.getOrientation(worldOr));\r
- }\r
- \r
- stack.addAll(pcp.getRelatedObjects(ProcessResource.plant3Dresource.HasSubPoint));\r
- }\r
- }\r
-\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.common;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.viewpoints.TraversalPath;\r
-import org.simantics.proconf.browsing.GraphExplorer;\r
-import org.simantics.utils.datastructures.Pair;\r
-\r
-\r
-\r
-\r
-\r
-public class PathUtils {\r
-\r
- public static void createPath(java.util.List<Resource> samplePath, TraversalPath path, Resource sampleInstance, Resource sampleSource, GraphExplorer oe) {\r
-// while (tNode != null) {\r
-// long[] path = tNode.getPath();\r
-// for (int i = 0; i < path.length; i++) {\r
-// samplePath.add(i, path[i]);\r
-// }\r
-// samplePath.add(path.length,tNode.getCoreId());\r
-// tNode = oe.getTreeParent(tNode);\r
-// }\r
- while (path != null) {\r
- Resource predicate = path.getPredicate();\r
- Resource obj = path.getResource();\r
- if (predicate != null) {\r
- samplePath.add(0,predicate);\r
- path = path.getTail();\r
- } else {\r
- // there is no relation and so this has to be root\r
- path = null; \r
- }\r
- samplePath.add(1,obj);\r
- \r
- }\r
- \r
- if (!sampleInstance.equals(samplePath.get(0)) || !sampleSource.equals(samplePath.get(samplePath.size()-1))) {\r
- String s = "";\r
- for (int i = 0; i < samplePath.size(); i++) {\r
- s += samplePath.get(i) + " ";\r
- }\r
- throw new RuntimeException("Path from " + sampleInstance + " to "\r
- + sampleSource + " is broken: " + s);\r
- }\r
-\r
-// String s = "";\r
-// for (int i = 0; i < samplePath.size(); i++) {\r
-// s += samplePath.get(i) + " ";\r
-// }\r
-// System.out.println("Path from " + sampleInstance + " to " + sampleSource + " is: " + s);\r
- samplePath.remove(0);\r
- }\r
- \r
- \r
- \r
- /**\r
- * Finds similar path in cloned resource\r
- * TODO : this isn't correct way to do this;\r
- * Rigth way would be finding mapping between two clones\r
- * and then find the similar resource \r
- * (Viewpoint used to create clone is required)\r
- * \r
- * @param path\r
- * @param begin\r
- * @return\r
- */\r
- public static IEntity findSimilar(java.util.List<Resource> path, IEntity begin) {\r
- if (path.size() == 0)\r
- return begin;\r
- if (path.size() == 1)\r
- return null;\r
- Graph g = begin.getGraph();\r
- java.util.List<Resource> tPath = new ArrayList<Resource>();\r
- tPath.addAll(path);\r
- \r
- Resource p = tPath.get(0); // predicate (relation)\r
- Resource o = tPath.get(1); // object \r
- tPath.remove(0);\r
- tPath.remove(0);\r
- \r
- IEntity predicate = EntityFactory.create(g, p);\r
-\r
- \r
- Collection<IEntity> possibleObjects = begin.getRelatedObjects(predicate);\r
- if (possibleObjects.size() == 0)\r
- return null;\r
- if (possibleObjects.size() == 1) \r
- return findSimilar(tPath, possibleObjects.iterator().next());\r
- else {\r
- IEntity object = EntityFactory.create(g, o);\r
- Collection<IEntity> objectTypes = object.getTypes();\r
- java.util.List<Pair<IEntity,IEntity>> list = new ArrayList<Pair<IEntity,IEntity>>();\r
- for (IEntity possible : possibleObjects) {\r
- boolean matchTypes = true;\r
- for (IEntity type : objectTypes) {\r
- if(!possible.isInstanceOf(type)) {\r
- matchTypes = false;\r
- break;\r
- }\r
- \r
- }\r
- if (matchTypes) {\r
- IEntity r = findSimilar(tPath,possible);\r
- if (r != null)\r
- list.add(new Pair<IEntity,IEntity>(possible,r));\r
- //return r;\r
- }\r
- }\r
- if (list.size() == 0)\r
- return null;\r
- if (list.size() == 1)\r
- return list.get(0).second;\r
- else {\r
- // uses names of objects to detect similarities\r
- String name = object.getName();\r
- if (name != null) {\r
- for (Pair<IEntity,IEntity> possible : list) {\r
- String otherName = possible.first.getName();\r
- //System.out.println(name + " : " + otherName);\r
- if (otherName != null && name.compareTo(otherName) == 0)\r
- return possible.second;\r
- }\r
- }\r
- }\r
- }\r
- \r
- return null;\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.common;\r
-\r
-import java.nio.FloatBuffer;\r
-import java.nio.IntBuffer;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Quat4d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.stubs.PipeControlPoint;\r
-import org.simantics.processeditor.stubs.PipelineComponent;\r
-import org.simantics.processeditor.stubs.TurnControlPoint;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.GeometryProvider;\r
-import org.simantics.proconf.g3d.base.MathTools;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-import com.jme.scene.Geometry;\r
-import com.jme.scene.Line;\r
-import com.jme.scene.TriMesh;\r
-import com.jme.util.geom.BufferUtils;\r
-\r
-\r
-\r
-/**\r
- * Geometry provider for pipe components.\r
- * TODO : split into three providers (one for each type) to faster access (ShapeNodes can cache geometry provider)\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public class PipeComponentProvider implements GeometryProvider {\r
- \r
- \r
- //private static double ELBOW_RING_ANGLE = 12.0/ Math.PI;\r
- //private static int RING_SEGMENTS = 8;\r
- \r
- private static double ELBOW_RING_ANGLE = 24.0/ Math.PI;\r
- private static int RING_SEGMENTS = 16;\r
- \r
- public boolean canHandle(IEntity instance) {\r
- if (instance.isInstanceOf(ProcessResource.plant3Dresource.Elbow))\r
- return true;\r
- if (instance.isInstanceOf(ProcessResource.plant3Dresource.Straight))\r
- return true;\r
- if (instance.isInstanceOf(ProcessResource.plant3Dresource.Reducer))\r
- return true; \r
- return false;\r
- }\r
-\r
- \r
- public Geometry[] getGeometryFromResource(IEntity instance, boolean transform) {\r
- if (instance.isInstanceOf(ProcessResource.plant3Dresource.Elbow)) {\r
- Geometry[] g = new Geometry[]{new TriMesh(),new Line()};\r
- if( getElbowGeometry(instance,g)) {\r
- return g;\r
- }\r
- return null;\r
- }\r
- \r
- if (instance.isInstanceOf(ProcessResource.plant3Dresource.Straight)) {\r
- Geometry[] g = new Geometry[]{new TriMesh(),new Line()};\r
- if( getStraightGeometry(instance,g)) {\r
- return g;\r
- }\r
- return null;\r
- }\r
- if (instance.isInstanceOf(ProcessResource.plant3Dresource.Reducer)) {\r
- Geometry[] g = new Geometry[]{new TriMesh(),new Line()};\r
- if (getReducerGeometry(instance,g)) {\r
- return g;\r
- }\r
- return null;\r
- }\r
- return null;\r
- }\r
- \r
- public boolean reconstructGeometry(IEntity instance, boolean transform, Geometry[] geometry) {\r
- if (instance.isInstanceOf(ProcessResource.plant3Dresource.Elbow))\r
- return getElbowGeometry(instance,geometry);\r
- if (instance.isInstanceOf(ProcessResource.plant3Dresource.Straight))\r
- return getStraightGeometry(instance,geometry);\r
- if (instance.isInstanceOf(ProcessResource.plant3Dresource.Reducer))\r
- return getReducerGeometry(instance,geometry);\r
- \r
- return false;\r
- }\r
-\r
- public boolean getElbowGeometry(IEntity instance, Geometry[] geometry) {\r
- PipelineComponent elbow = new PipelineComponent(instance);\r
- PipeControlPoint pcp = elbow.getControlPoint();\r
- if (pcp == null) {\r
- ErrorLogger.defaultLogError("Elbow " + instance + " has no control point", null);\r
- return false;\r
- }\r
- TurnControlPoint tcp = new TurnControlPoint(pcp);\r
- // double turnAngleValue = tcp.getTurnAngleValue();\r
- \r
- double pipeRadius = elbow.getPipeDiameter()[0]*0.5;\r
- double elbowRadius = elbow.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasTurnRadius);\r
- double R = tcp.getLength()[0]; //getComponentOffset();\r
- double turnAngle = tcp.getTurnAngle()[0];\r
-\r
- PipeControlPoint startControlPoint = tcp.getPrevious();\r
- PipeControlPoint endControlPoint = tcp.getNext();\r
- if (startControlPoint == null || endControlPoint == null)\r
- return false;\r
- \r
- //Point3d start = getLocalPoint(pipeline,startControlPoint);\r
- //Point3d middle = getLocalPoint(pipeline,tcp);\r
- //Point3d end = getLocalPoint(pipeline,endControlPoint); \r
- \r
- Point3d start = G3DTools.getPoint(startControlPoint.getWorldPosition());\r
- Point3d middle = G3DTools.getPoint(tcp.getWorldPosition());\r
- Point3d end = G3DTools.getPoint(endControlPoint.getWorldPosition());\r
- \r
- Vector3d dir1 = new Vector3d(middle);\r
- dir1.sub(start);\r
- Vector3d dir2 = new Vector3d(end);\r
- dir2.sub(middle);\r
- \r
- Vector3d n = new Vector3d(dir1);\r
- n.normalize();\r
- Vector3d offset = new Vector3d(n);\r
-\r
- offset.scale(R);\r
- Vector3d startPipe = new Vector3d(middle);\r
- startPipe.sub(offset);\r
- // normal of the plane\r
- Vector3d normal = new Vector3d();\r
- normal.cross(dir1, dir2);\r
- Vector3d elbowCenter = new Vector3d();\r
- elbowCenter.cross(normal, dir1);\r
- elbowCenter.normalize();\r
- elbowCenter.scale(elbowRadius);\r
- elbowCenter.add(startPipe);\r
-\r
- elbowCenter.sub(middle);\r
- \r
- // creates sweep shape by rotating a circle\r
- // several values must be checked if they are infinite (OCC crashes if they are)\r
- if (turnAngle > 0.001 && normal.lengthSquared() > 0.0 && !(Double.isInfinite(turnAngle)) && isValid(n) && isValid(startPipe)) {\r
-// System.out.println(startPipe + " " + middle + " " + n + " " + elbowCenter + " " + normal + " " + turnAngle);\r
-// gp_Circ circ = new gp_Circ(new double[] { startPipe.x - middle.x, startPipe.y - middle.y,\r
-// startPipe.z - middle.z, n.x, n.y, n.z }, pipeRadius);\r
-// TopoDS_Edge ed = (TopoDS_Edge) new BRepBuilderAPI_MakeEdge(circ).shape();\r
-// TopoDS_Wire w = (TopoDS_Wire) new BRepBuilderAPI_MakeWire(ed).shape();\r
-// TopoDS_Face F = (TopoDS_Face) new BRepBuilderAPI_MakeFace(w).shape();\r
-// TopoDS_Shape S4 = new BRepPrimAPI_MakeRevol(F, new double[] { elbowCenter.x, elbowCenter.y, elbowCenter.z,\r
-// normal.x, normal.y, normal.z }, turnAngle).shape();\r
-//\r
-// try {\r
-// return OccTriangulator.getGeometry(S4, true);\r
-//\r
-// } catch (Exception e) {\r
-// e.printStackTrace();\r
-// return null;\r
-// }\r
- elbow(pipeRadius,elbowRadius,n,normal,turnAngle,elbowCenter,geometry);\r
- return true;\r
- }\r
- return false;\r
-\r
- }\r
- \r
- public void elbow(double radius, double turnRadius, Vector3d sn, Vector3d rn, double angle, Vector3d p, Geometry[] geometry) {\r
- Vector3d t = new Vector3d();\r
- t.cross(sn,rn);\r
- t.normalize();\r
- t.scale(turnRadius);\r
- Vector3d vs[][] = calcCirc(RING_SEGMENTS, 0.0, 0.0, 0.0, sn.x, sn.y, sn.z, radius);\r
- int rings = (int)Math.ceil(angle * ELBOW_RING_ANGLE * Math.sqrt(turnRadius));\r
- if (rings < 2)\r
- rings = 2;\r
- FloatBuffer v = BufferUtils.createFloatBuffer(vs[0].length * rings * 3);\r
- FloatBuffer n = BufferUtils.createFloatBuffer(vs[0].length * rings * 3);\r
- Quat4d q = new Quat4d();\r
- AxisAngle4d aa = new AxisAngle4d();\r
- Vector3d pos = new Vector3d();\r
- Vector3d t2 = new Vector3d();\r
- \r
- aa.x = rn.x;\r
- aa.y = rn.y;\r
- aa.z = rn.z;\r
- for (int i = 0; i < rings; i++) {\r
- double a = (double)i/(double)(rings-1) * angle;\r
- aa.angle = a;\r
- q.set(aa);\r
- MathTools.rotate(q, t, pos);\r
- for (int j = 0; j < vs[0].length; j++) {\r
- MathTools.rotate(q, vs[0][j], t2);\r
- t2.add(pos);\r
- t2.add(p);\r
- v.put((float)t2.x);\r
- v.put((float)t2.y);\r
- v.put((float)t2.z);\r
- MathTools.rotate(q, vs[1][j], t2);\r
- n.put((float)t2.x);\r
- n.put((float)t2.y);\r
- n.put((float)t2.z);\r
- }\r
- }\r
- int indexCount = indexCount(RING_SEGMENTS, rings);\r
- int edgeIndexCount = edgeIndexCount(RING_SEGMENTS, rings);\r
- IntBuffer i = BufferUtils.createIntBuffer(indexCount);\r
- IntBuffer ei = BufferUtils.createIntBuffer(edgeIndexCount);\r
- createIndices(i, RING_SEGMENTS, rings);\r
- createEdgeIndices(ei, RING_SEGMENTS, rings);\r
- TriMesh m = (TriMesh)geometry[0];//new TriMesh();\r
- Line l = (Line)geometry[1];//new Line();\r
- m.reconstruct(v, n, null, null,i);\r
- l.reconstruct(v, null, null, null,ei);\r
- //return new Geometry[]{m,l};\r
- }\r
-\r
- public boolean getStraightGeometry(IEntity instance, Geometry[] geometry) {\r
- //Straight straight = new Straight(instance);\r
- PipelineComponent straight = new PipelineComponent(instance);\r
- double pipeRadius = straight.getPipeDiameter()[0] * 0.5;\r
- //PipeRun pipeline = (PipeRun)PipingTools2.getPipeRun(straight.toPipelineComponent());//parent.getGraphicsNode();\r
- //double pipeRadius = pipeline.getPipeDiameter()[0] * 0.5;\r
- \r
- \r
-// PipeControlPoint startControlPoint = (PipeControlPoint)StubFactory.getStubForResource(this.getClass().getClassLoader(),straight.getHasPreviousControlPoint().getResource());\r
-// PipeControlPoint endControlPoint = (PipeControlPoint)StubFactory.getStubForResource(this.getClass().getClassLoader(),straight.getHasNextControlPoint().getResource());\r
- \r
- // start and end position of the pipe\r
- // positions may be linked to other components, like nozzles\r
- // and then their coordinates are in component's local coordinates\r
- // which must be transformed into pipeline's local coordinates\r
- \r
- Point3d startPipe = new Point3d();//getLocalPoint(pipeline,startControlPoint);\r
-\r
- \r
- Point3d endPipe = new Point3d(); //getLocalPoint(pipeline, endControlPoint);\r
-\r
- \r
- \r
- \r
- PipingTools2.getInlineComponentEnds(straight, startPipe, endPipe);\r
- boolean b = createStraightGeometry(startPipe, endPipe, pipeRadius, geometry);\r
- if (!b)\r
- ErrorLogger.getDefault().logWarning("Straight pipe " + instance + " is too short", null);\r
- return b;\r
- }\r
- \r
- public static boolean createStraightGeometry(Point3d startPipe, Point3d endPipe, double pipeRadius, Geometry geometry[]) {\r
- Vector3d dir = new Vector3d(endPipe);\r
- dir.sub(startPipe);\r
- \r
- double h = dir.length();\r
-// several values must be checked if they are infinite (OCC crashes if they are)\r
- if (h > 0.001 && h < 10000.0 && pipeRadius > 0.01) {\r
-\r
- dir.normalize();\r
-\r
- Vector3d[][] v1 = calcCirc(RING_SEGMENTS, startPipe.x, startPipe.y, startPipe.z, dir.x, dir.y, dir.z, pipeRadius);\r
- Vector3d[][] v2 = calcCirc(RING_SEGMENTS, endPipe.x, endPipe.y, endPipe.z, dir.x, dir.y, dir.z, pipeRadius);\r
- TriMesh m = (TriMesh)geometry[0];//new TriMesh();\r
- Line l = null;\r
- if (geometry.length>1)\r
- l = (Line)geometry[1];//new Line();\r
- FloatBuffer v = BufferUtils.createFloatBuffer(v1[0].length * 2 * 3);\r
- FloatBuffer n = BufferUtils.createFloatBuffer(v1[0].length * 2 * 3 );\r
- for (int i = 0; i < v1[0].length; i++) {\r
- v.put((float)v1[0][i].x);\r
- v.put((float)v1[0][i].y);\r
- v.put((float)v1[0][i].z);\r
- n.put((float)v1[1][i].x);\r
- n.put((float)v1[1][i].y);\r
- n.put((float)v1[1][i].z);\r
- }\r
- for (int i = 0; i < v2[0].length; i++) {\r
- v.put((float)v2[0][i].x);\r
- v.put((float)v2[0][i].y);\r
- v.put((float)v2[0][i].z);\r
- n.put((float)v2[1][i].x);\r
- n.put((float)v2[1][i].y);\r
- n.put((float)v2[1][i].z);\r
- }\r
- \r
- IntBuffer i = BufferUtils.createIntBuffer(indexCount(RING_SEGMENTS, 2));\r
- createIndices(i, RING_SEGMENTS, 2);\r
- m.reconstruct(v, n, null, null,i);\r
- if (l != null) {\r
- IntBuffer ei = BufferUtils.createIntBuffer(edgeIndexCount(RING_SEGMENTS, 2));\r
- createEdgeIndices(ei, RING_SEGMENTS, 2);\r
- l.reconstruct(v, null, null, null,ei);\r
- }\r
- return true;\r
- } \r
- return false;\r
- }\r
- \r
- public static void createStraightEdges(Line l, Point3d startPipe, Point3d endPipe, double pipeRadius) {\r
- Vector3d dir = new Vector3d(endPipe);\r
- dir.sub(startPipe);\r
- dir.normalize();\r
- Vector3d[][] v1 = calcCirc(8, startPipe.x, startPipe.y, startPipe.z, dir.x, dir.y, dir.z, pipeRadius);\r
- Vector3d[][] v2 = calcCirc(8, endPipe.x, endPipe.y, endPipe.z, dir.x, dir.y, dir.z, pipeRadius);\r
- FloatBuffer v = BufferUtils.createFloatBuffer(v1[0].length * 2 * 3);\r
- FloatBuffer n = BufferUtils.createFloatBuffer(v1[0].length * 2 * 3 );\r
- for (int i = 0; i < v1[0].length; i++) {\r
- v.put((float)v1[0][i].x);\r
- v.put((float)v1[0][i].y);\r
- v.put((float)v1[0][i].z);\r
- n.put((float)v1[1][i].x);\r
- n.put((float)v1[1][i].y);\r
- n.put((float)v1[1][i].z);\r
- }\r
- for (int i = 0; i < v2[0].length; i++) {\r
- v.put((float)v2[0][i].x);\r
- v.put((float)v2[0][i].y);\r
- v.put((float)v2[0][i].z);\r
- n.put((float)v2[1][i].x);\r
- n.put((float)v2[1][i].y);\r
- n.put((float)v2[1][i].z);\r
- }\r
- \r
-\r
- IntBuffer ei = BufferUtils.createIntBuffer(edgeIndexCount(8, 2));\r
- createEdgeIndices(ei, 8, 2);\r
- l.reconstruct(v, null, null, null,ei);\r
- }\r
-\r
- public boolean getReducerGeometry(IEntity instance,Geometry[] geometry) {\r
- //Reducer reducer = new Reducer(instance);\r
- PipelineComponent reducer = new PipelineComponent(instance);\r
- PipeControlPoint pcp = reducer.getControlPoint();\r
- PipeControlPoint pcp2 = pcp.getSubPoint().iterator().next();\r
- //PipeControlPoint pcp = reducer.getHasControlPoint();\r
- //PipeControlPoint prev = pcp.getPreviousPoint();\r
- //assert (prev != null);\r
- //Point3d prevPoint = GraphicsNodeTools.getPoint(prev.getLocalPosition());\r
- //Point3d point = GraphicsNodeTools.getPoint(pcp.getLocalPosition());\r
- //Vector3d dir = new Vector3d(point);\r
- //dir.sub(prevPoint);\r
- //dir.normalize();\r
- double h = reducer.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength);\r
- double r1 = pcp.getPipeDiameter()[0] * 0.5;//reducer.getBottomRadius();\r
- double r2 = pcp2.getPipeDiameter()[0] * 0.5;//reducer.getTopRadiusValue();\r
- \r
- if (h > 0.001 && r1 > 0.001 && r2 > 0.001 ) {\r
-// TopoDS_Shape S4 = getShape(h,r1,r2, instance.isInstanceOf(GlobalIdMap.get(PSK3DModelingOntologyMapping.ECCENTRIC_REDUCER)));\r
-// \r
-// \r
-// try {\r
-// return OccTriangulator.getGeometry(S4, true);\r
-//\r
-// } catch (Exception e) {\r
-// e.printStackTrace();\r
-// return null;\r
-// }\r
- Vector3d[][] v1 = calcCirc(RING_SEGMENTS, -h * 0.5, 0.0, 0.0, 1.0, 0.0, 0.0, r1);\r
- Vector3d[][] v2 = calcCirc(RING_SEGMENTS, h * 0.5, 0.0, instance.isInstanceOf(ProcessResource.plant3Dresource.EccentricReducer) ? (r1 - r2) : 0.0, 1.0, 0.0, 0.0, r2);\r
- TriMesh m = (TriMesh)geometry[0];//new TriMesh();\r
- Line l = (Line)geometry[1];//new Line();\r
- FloatBuffer v = BufferUtils.createFloatBuffer(v1[0].length * 2 * 3);\r
- FloatBuffer n = BufferUtils.createFloatBuffer(v1[0].length * 2 * 3 );\r
- for (int i = 0; i < v1[0].length; i++) {\r
- v.put((float)v1[0][i].x);\r
- v.put((float)v1[0][i].y);\r
- v.put((float)v1[0][i].z);\r
- n.put((float)v1[1][i].x);\r
- n.put((float)v1[1][i].y);\r
- n.put((float)v1[1][i].z);\r
- }\r
- for (int i = 0; i < v2[0].length; i++) {\r
- v.put((float)v2[0][i].x);\r
- v.put((float)v2[0][i].y);\r
- v.put((float)v2[0][i].z);\r
- n.put((float)v2[1][i].x);\r
- n.put((float)v2[1][i].y);\r
- n.put((float)v2[1][i].z);\r
- }\r
- \r
- IntBuffer i = BufferUtils.createIntBuffer(indexCount(RING_SEGMENTS, 2));\r
- IntBuffer ei = BufferUtils.createIntBuffer(edgeIndexCount(RING_SEGMENTS, 2));\r
- createIndices(i, RING_SEGMENTS, 2);\r
- createEdgeIndices(ei, RING_SEGMENTS, 2);\r
- m.reconstruct(v, n, null, null,i);\r
- l.reconstruct(v, null, null, null,ei);\r
- //return new Geometry[]{m,l};\r
- return true;\r
- \r
- }\r
- return false;\r
-\r
- }\r
- \r
-// protected TopoDS_Shape getShape(double h, double r1, double r2, boolean eccentric) {\r
-// TopoDS_Shape S4 = null;\r
-//\r
-// gp_Circ circ1 = new gp_Circ(new double[] { -h * 0.5, 0.0, 0.0, 1.0, 0.0, 0.0 }, r1);\r
-// TopoDS_Edge ed1 = (TopoDS_Edge) new BRepBuilderAPI_MakeEdge(circ1)\r
-// .shape();\r
-// TopoDS_Wire w1 = (TopoDS_Wire) new BRepBuilderAPI_MakeWire(ed1).shape();\r
-// gp_Circ circ2 = new gp_Circ(new double[] { h * 0.5, 0.0, eccentric ? r1 - r2 : 0.0, 1.0, 0.0, 0.0 }, r2);\r
-// TopoDS_Edge ed2 = (TopoDS_Edge) new BRepBuilderAPI_MakeEdge(circ2)\r
-// .shape();\r
-// TopoDS_Wire w2 = (TopoDS_Wire) new BRepBuilderAPI_MakeWire(ed2).shape();\r
-//// BRepOffsetAPI_ThruSections generatorb = new BRepOffsetAPI_ThruSections(\r
-//// true, false);\r
-// BRepOffsetAPI_ThruSections generatorb = new BRepOffsetAPI_ThruSections(true, true);\r
-// generatorb.addWire(w1);\r
-// generatorb.addWire(w2);\r
-// generatorb.build();\r
-// S4 = generatorb.shape();\r
-// return S4;\r
-// }\r
- \r
- private boolean isValid(Vector3d v) {\r
- if (Double.isInfinite(v.x) || \r
- Double.isNaN(v.x) ||\r
- Double.isInfinite(v.y) || \r
- Double.isNaN(v.y) ||\r
- Double.isInfinite(v.z) || \r
- Double.isNaN(v.z))\r
- return false;\r
- return true;\r
- }\r
- \r
- private static Vector3d[][] calcCirc(int segmentCount,double x, double y, double z, double dx, double dy, double dz, double r) {\r
- Vector3d res[][] = new Vector3d[2][segmentCount + 1];\r
- Vector3d t = new Vector3d();\r
- if (Math.abs(dy) + Math.abs(dz) < 0.001) {\r
- t.y = 1.0;\r
- } else {\r
- t.x = 1.0;\r
- }\r
- Vector3d d = new Vector3d(dx,dy,dz);\r
- Vector3d a = new Vector3d();\r
- a.cross(t, d);\r
- a.normalize();\r
- a.scale(r);\r
- Quat4d q = new Quat4d();\r
- AxisAngle4d aa = new AxisAngle4d();\r
- aa.x = dx;\r
- aa.y = dy;\r
- aa.z = dz;\r
- for (int i = 0; i <= segmentCount; i++) {\r
- aa.angle = (double)i / (double) segmentCount * Math.PI * 2.0;\r
- q.set(aa);\r
- res[0][i] = new Vector3d();\r
- res[1][i] = new Vector3d();\r
- MathTools.rotate(q, a, res[0][i]);\r
- res[1][i].normalize(res[0][i]);\r
- //res[1][i].negate();\r
- res[0][i].x += x;\r
- res[0][i].y += y;\r
- res[0][i].z += z; \r
- }\r
- return res;\r
- \r
- }\r
- \r
- private static int indexCount(int segmentCount, int ringCount) {\r
- return 6 * segmentCount * (ringCount - 1);\r
- }\r
- \r
- private static void createIndices(IntBuffer buf, int segmentCount, int ringCount) {\r
- int s = segmentCount + 1;\r
- for (int ring = 0; ring < ringCount - 1; ring++) {\r
- for (int segment = 0; segment < segmentCount; segment++) {\r
- int index = ring * s + segment;\r
- buf.put(index);\r
- buf.put(index + 1);\r
- buf.put(index + s);\r
- buf.put(index + s + 1);\r
- buf.put(index + s);\r
- buf.put(index + 1);\r
- }\r
- }\r
- }\r
- \r
- private static int edgeIndexCount(int segmentCount, int ringCount) {\r
- if (ringCount > 1) {\r
- return segmentCount * 4 + ringCount * 4 * (segmentCount / 4);\r
- } else {\r
- return ringCount * segmentCount * 2;\r
- }\r
- }\r
- \r
- private static void createEdgeIndices(IntBuffer buf, int segmentCount, int ringCount) {\r
- int s = segmentCount + 1;\r
- if (ringCount > 1) {\r
- int ring = 0;\r
- for (int segment = 0; segment < segmentCount; segment++) {\r
- int index = ring * s + segment;\r
- buf.put(index);\r
- buf.put(index + 1);\r
- }\r
- ring = ringCount - 1;\r
- for (int segment = 0; segment < segmentCount; segment++) {\r
- int index = ring * s + segment;\r
- buf.put(index);\r
- buf.put(index + 1);\r
- }\r
- int space = segmentCount / 4;\r
- for (ring = 0; ring < ringCount - 1; ring++) {\r
- for (int segment = 0; segment < segmentCount; segment+=space) {\r
- int index = ring * s + segment;\r
- buf.put(index);\r
- buf.put(index + s);\r
- }\r
- }\r
- } else {\r
- int ring = 0;\r
- for (int segment = 0; segment < segmentCount; segment++) {\r
- int index = ring * s + segment;\r
- buf.put(index);\r
- buf.put(index + 1);\r
- }\r
- }\r
- buf.limit(buf.position());\r
- \r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.common;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.stubs.PipeControlPoint;\r
-import org.simantics.processeditor.stubs.PipeRun;\r
-import org.simantics.processeditor.stubs.PipelineComponent;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.MathTools;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-\r
-/**\r
- * Rules that update pipeline.\r
- * TODO : optimize, remove stubs\r
- * \r
- * FIXME : transformations\r
- * \r
- * TODO : FixedAngleTurnComponents are handled like VariableAngleTurnComponents\r
- * \r
- * \r
- * @author Marko Luukkainen <Marko.Luukkainen@vtt.fi>\r
- *\r
- */\r
-public class PipingRules {\r
- \r
- private static final boolean DEBUG = false;\r
- private static final boolean DUMMY = false;\r
- \r
- private static final double MIN_TURN_ANGLE = 0.01;\r
- \r
- private static final int REMOVE_NONE = 0;\r
- private static final int REMOVE_START = 1;\r
- private static final int REMOVE_END = 2;\r
- private static final int REMOVE_BOTH = 3;\r
- \r
- private enum PathLegUpdateType {NONE,PREV,NEXT,PREV_S,NEXT_S};\r
- \r
- /**\r
- * Rule\r
- * \r
- * @param resources\r
- * @param pp\r
- * @throws TransactionException\r
- */\r
- public static void pipeControlPointPositionUpdate(Graph g, Resource pp) {\r
- \r
- PipeControlPoint pcp = new PipeControlPoint(g,pp);\r
- if (DEBUG) System.out.println("PipeControlPoint changed " + pp);\r
- \r
- boolean changed = ControlPointTools.isControlPointChanged(pcp);\r
-\r
- \r
- if (changed) {\r
- if (pcp.isInstanceOf(ProcessResource.plant3Dresource.PathLegEndControlPoint)) {\r
- updatePathLegEndControlPoint(pcp);\r
- } else {\r
- updateInlineControlPoint(pcp);\r
- }\r
- } \r
- \r
- }\r
- \r
- \r
- \r
- public static class ExpandIterInfo {\r
- // these two are turn control points\r
- private PipeControlPoint start; \r
- private PipeControlPoint end;\r
- private int type;\r
- \r
- public ExpandIterInfo() {\r
- \r
- }\r
- \r
- public ExpandIterInfo(PipeControlPoint tcp, int type) {\r
- if (type == REMOVE_START)\r
- start = tcp;\r
- else \r
- end = tcp;\r
- this.type = type;\r
- }\r
- \r
- public ExpandIterInfo(PipeControlPoint start, PipeControlPoint end) {\r
- this.start = start;\r
- this.end = end;\r
- this.type = REMOVE_BOTH;\r
- }\r
- \r
- public PipeControlPoint getEnd() {\r
- return end;\r
- }\r
- public void setEnd(PipeControlPoint end) {\r
- this.end = end;\r
- }\r
- public PipeControlPoint getStart() {\r
- return start;\r
- }\r
- public void setStart(PipeControlPoint start) {\r
- this.start = start;\r
- }\r
- public int getType() {\r
- return type;\r
- }\r
- public void setType(int type) {\r
- this.type = type;\r
- }\r
- \r
- \r
- }\r
- \r
- private static void updatePathLegEndControlPoint(PipeControlPoint pcp) {\r
- if (DEBUG) System.out.println("PipingTools.updateRunEndControlPoint() " + pcp.getResource());\r
- if (pcp.getNext() != null) {\r
- updatePathLegNext(pcp,pcp,PathLegUpdateType.NEXT_S);\r
- }\r
- if (pcp.getPrevious() != null) {\r
- updatePathLegPrev(pcp,pcp,PathLegUpdateType.PREV_S);\r
- }\r
- \r
- }\r
- \r
- private static void updateInlineControlPoint(PipeControlPoint pcp) {\r
- if (DEBUG) System.out.println("PipingTools.updateInlineControlPoint() " + pcp.getResource());\r
- PipeControlPoint start = ControlPointTools.findPreviousEnd(pcp);\r
- updatePathLegNext(start,pcp,PathLegUpdateType.NONE);\r
- }\r
- \r
- private static PipeControlPoint insertElbow(PipeControlPoint pcp1 , PipeControlPoint pcp2, Point3d pos) {\r
- if (DEBUG) System.out.println("PipingRules.insertElbow() " + pcp1.getResource() + " " + pcp2.getResource()+ " " + pos);\r
- PipelineComponent elbow = PipingTools2.instantiatePipelineComponent(pcp1.getGraph(), ControlPointTools.getPipeRun(pcp1).getResource(), ProcessResource.plant3Dresource.Elbow);\r
- PipeControlPoint pcp = elbow.getControlPoint();\r
- \r
- ControlPointTools.insertControlPoint(pcp, pcp1,pcp2);\r
- \r
- ControlPointTools.setWorldPosition(pcp, pos);\r
-\r
- return pcp;\r
- }\r
- \r
- private static void updatePathLegNext(PipeControlPoint start, PipeControlPoint updated, PathLegUpdateType lengthChange){\r
- ArrayList<PipeControlPoint> list = new ArrayList<PipeControlPoint>();\r
- PipeControlPoint end = ControlPointTools.findNextEnd(start,list);\r
- // this is for inline cp that is also path leg end\r
- if (start.equals(updated))\r
- lengthChange = PathLegUpdateType.NEXT;\r
- else if (end.equals(updated))\r
- lengthChange = PathLegUpdateType.PREV; \r
- updatePathLegNext(start, list, end, updated, lengthChange);\r
- }\r
- \r
- private static void updatePathLegNext(PipeControlPoint start, ArrayList<PipeControlPoint> list, PipeControlPoint end, PipeControlPoint updated, PathLegUpdateType lengthChange) {\r
- updatePathLeg(start,list,end,false,0,new ArrayList<ExpandIterInfo>(),updated, lengthChange);\r
- }\r
- \r
- private static class UpdateStruct2 {\r
- public PipeControlPoint start;\r
- public Point3d startPoint;\r
- public ArrayList<PipeControlPoint> list;\r
- public PipeControlPoint end;\r
- public Point3d endPoint;\r
- public Vector3d dir;\r
- public Vector3d offset;\r
- public boolean hasOffsets;\r
- public int iter;\r
- public boolean reversed;\r
- public ArrayList<ExpandIterInfo> toRemove;\r
- public PipeControlPoint updated;\r
- public UpdateStruct2(PipeControlPoint start, Point3d startPoint, ArrayList<PipeControlPoint> list, PipeControlPoint end, Point3d endPoint, Vector3d dir, Vector3d offset, boolean hasOffsets, int iter, boolean reversed, ArrayList<ExpandIterInfo> toRemove, PipeControlPoint updated) {\r
- super();\r
- this.start = start;\r
- this.startPoint = startPoint;\r
- this.list = list;\r
- this.end = end;\r
- this.endPoint = endPoint;\r
- this.dir = dir;\r
- this.offset = offset;\r
- this.hasOffsets = hasOffsets;\r
- this.iter = iter;\r
- this.reversed = reversed;\r
- this.toRemove = toRemove;\r
- this.updated = updated;\r
- }\r
- \r
- public String toString() {\r
- return start.getResource() + " " + end.getResource() + " " + dir + " " + hasOffsets + " " + offset + " " + iter + " " + toRemove.size();\r
- }\r
- \r
- }\r
- \r
- private static boolean calculateOffset(Point3d startPoint, Point3d endPoint, ArrayList<PipeControlPoint> list, Vector3d dir, Vector3d offset) {\r
- boolean hasOffsets = false;\r
- dir.set(startPoint);\r
- dir.sub(endPoint);\r
- dir.normalize();\r
- offset.set(0.0,0.0,0.0);\r
- for (PipeControlPoint icp : list) {\r
- if (icp.isInstanceOf(ProcessResource.plant3Dresource.OffsettingPoint)) {\r
- hasOffsets = true;\r
- offset.add(ControlPointTools.getSizeChangeOffsetVector(icp,dir));\r
- }\r
- else if (icp.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint)) \r
- ErrorLogger.defaultLogError("Updating pipe run, found offset controlpoint " + icp.getResource(), new Exception("ASSERT!"));\r
- }\r
- return hasOffsets;\r
- }\r
- \r
- /**\r
- * @param start starting point of the pipe run\r
- * @param list list of inline control points in the pipe run\r
- * @param end ending point of the pipe run\r
- * @param reversed boolean flag indicating wether start or end control point was modified (if true then end point was modified)\r
- * @throws TransactionException\r
- */\r
- private static void updatePathLeg(PipeControlPoint start, ArrayList<PipeControlPoint> list, PipeControlPoint end, boolean reversed, int iter, ArrayList<ExpandIterInfo> toRemove, PipeControlPoint updated, PathLegUpdateType lengthChange) {\r
- // FIXME: direction is calculated wrong way!\r
- boolean hasOffsets = false;\r
- Vector3d offset = new Vector3d();\r
- Point3d startPoint = G3DTools.getPoint(start.getWorldPosition());\r
- Point3d endPoint = G3DTools.getPoint(end.getWorldPosition());\r
- Vector3d dir = new Vector3d ();\r
- hasOffsets = calculateOffset(startPoint, endPoint, list, dir, offset);\r
- updatePathLeg(new UpdateStruct2(start, startPoint, list, end, endPoint, dir, offset, hasOffsets, iter, reversed, toRemove, updated), lengthChange);\r
- \r
- }\r
- \r
- private static void updatePathLeg(UpdateStruct2 u, PathLegUpdateType lengthChange){\r
- int directed = 0;\r
- if (u.start.isInstanceOf(ProcessResource.plant3Dresource.DirectedControlPoint))\r
- directed ++;\r
- if (u.end.isInstanceOf(ProcessResource.plant3Dresource.DirectedControlPoint))\r
- directed++;\r
- switch (directed) {\r
- case 0:\r
- updateFreePathLeg(u,lengthChange);\r
- break;\r
- case 1:\r
- updateDirectedPathLeg(u,lengthChange);\r
- break;\r
- case 2:\r
- updateDualDirectedPathLeg(u,lengthChange);\r
- break;\r
- }\r
- \r
- }\r
- \r
- private static void updateFreePathLeg(UpdateStruct2 u, PathLegUpdateType lengthChange) {\r
- if (DEBUG) System.out.println("PipingRules.updateFreePipeRun " + u + " " + lengthChange);\r
- checkExpandPathLeg(u, lengthChange);\r
- }\r
- \r
- private static void updateInlineControlPoints(UpdateStruct2 u, boolean checkSizes) {\r
- if (DEBUG) System.out.println("PipingTools.updateInlineControlPoints() " + u);\r
- \r
- if (!u.hasOffsets) {\r
- // FIXME : cache positions\r
- if (!checkSizes) {\r
- for (PipeControlPoint icp : u.list) {\r
- updateInlineControlPoint(icp, u.startPoint, u.endPoint,u.dir);\r
- }\r
- return;\r
- }\r
- \r
- ArrayList<PipeControlPoint> pathLegPoints = new ArrayList<PipeControlPoint>();\r
- pathLegPoints.add(u.start);\r
- for (PipeControlPoint icp : u.list) {\r
- //updateInlineControlPoint(icp, u.startPoint, u.endPoint,u.dir);\r
- updateBranchControlPointBranches(icp);\r
- pathLegPoints.add(icp);\r
- }\r
- pathLegPoints.add(u.end);\r
- \r
- // TODO : values can be cached in the loop\r
- for (int i = 1; i < pathLegPoints.size(); i++) {\r
- PipeControlPoint icp = pathLegPoints.get(i);\r
-\r
- PipeControlPoint prev;\r
- Point3d prevPos;\r
- prev = pathLegPoints.get(i-1);\r
- prevPos = G3DTools.getPoint(prev.getWorldPosition());\r
- Point3d currentPos = G3DTools.getPoint(icp.getWorldPosition());\r
- \r
- if (icp.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthControlPoint)) { \r
- if (i != pathLegPoints.size() - 1) {\r
- PipeControlPoint next;\r
- Point3d nextPos;\r
- next = pathLegPoints.get(i + 1);\r
- nextPos = G3DTools.getPoint(next.getWorldPosition());\r
- Vector3d dir = new Vector3d(nextPos);\r
- dir.sub(prevPos);\r
- double l = dir.lengthSquared(); // distance between control points (square)\r
- double l2prev = ControlPointTools.getInlineLength(prev); // distance taken by components\r
- double l2next = ControlPointTools.getInlineLength(next); \r
- double l2 = l2prev + l2next;\r
- double l2s = MathTools.square(l2);\r
- if (l2s < l) { // check if there is enough space for variable length component.\r
- // components fit\r
- dir.normalize();\r
- double length = Math.sqrt(l) - l2; // true length of the variable length component \r
- dir.scale(length*0.5 + l2prev); // calculate center position of the component\r
- dir.add(prevPos);\r
- ControlPointTools.setWorldPosition(icp,dir);\r
- icp.setRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength, length);\r
- } else {\r
- //components leave no space to the component and it must be removed\r
- ControlPointTools.removeControlPoint(icp);\r
- }\r
-\r
- } else {\r
- // this is variable length component at the end of the piperun.\r
- // the problem is that we want to keep unconnected end of the component in the same\r
- // place, but center of the component must be moved.\r
- double currentLength = icp.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength);\r
- Vector3d dir = new Vector3d();\r
- dir.sub(currentPos,prevPos);\r
- dir.normalize();\r
- Point3d endPos = new Point3d(dir);\r
- endPos.scale(currentLength * 0.5);\r
- endPos.add(currentPos); //this is the free end of the component\r
- \r
- double offset = ControlPointTools.getInlineLength(prev);\r
- Point3d beginPos = new Point3d(dir);\r
- beginPos.scale(offset);\r
- beginPos.add(prevPos); //this is the connected end of the component\r
- \r
- double l = beginPos.distance(endPos);\r
- \r
- dir.scale(l*0.5);\r
- beginPos.add(dir); //center position\r
- \r
- if (DEBUG) System.out.println("PipingRules.updateInlineControlPoints() setting variable length to " + l);\r
- icp.setRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength, l);\r
- \r
- ControlPointTools.setWorldPosition(icp, beginPos);\r
- }\r
- i++;\r
- \r
- } else if (!prev.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthControlPoint)){\r
- // If this and previous control point are not variable length pcps, we'll have to check if there is no empty space between them.\r
- // I there is, we'll have to create new variable length component between them.\r
- Vector3d dir = new Vector3d(currentPos);\r
- dir.sub(prevPos);\r
- double l = dir.lengthSquared();\r
- double l2prev = ControlPointTools.getInlineLength(prev);\r
- double l2next = ControlPointTools.getInlineLength(icp);\r
- double l2 = l2prev + l2next;\r
- double l2s = l2 * l2;\r
- if (l > l2s) {\r
- PipelineComponent component = PipingTools2.instantiatePipelineComponent(prev.getGraph(), ControlPointTools.getPipeRun(prev).getResource(), ProcessResource.plant3Dresource.Straight);\r
- PipeControlPoint scp = component.getControlPoint();\r
- ControlPointTools.insertControlPoint(scp, prev, icp);\r
- \r
- dir.normalize();\r
- double length = Math.sqrt(l) - l2; // true length of the variable length component \r
- dir.scale(length*0.5 + l2prev); // calculate center position of the component\r
- dir.add(prevPos);\r
- ControlPointTools.setWorldPosition(scp, dir);\r
- scp.setRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength, length);\r
- }\r
- }\r
- }\r
- } else {\r
- u.endPoint.sub(u.offset);\r
- // FIXME : straights\r
- for (PipeControlPoint icp : u.list) {\r
- updateInlineControlPoint(icp, u.startPoint, u.endPoint,u.dir);\r
- updateBranchControlPointBranches(icp);\r
- if (icp.isInstanceOf(ProcessResource.plant3Dresource.OffsettingPoint)) {\r
- // TODO : offset vector is already calculated and should be\r
- // cached\r
- u.offset = ControlPointTools.getSizeChangeOffsetVector(icp, u.dir);\r
- updateOffsetPoint( icp, u.offset);\r
- u.startPoint.add(u.offset);\r
- u.endPoint.add(u.offset);\r
- }\r
- }\r
- }\r
- }\r
- \r
- \r
- \r
- private static void ppNoOffset(UpdateStruct2 u) {\r
- if (DEBUG)System.out.println("PipingRules.ppNoOffset() " + u);\r
- Vector3d offset = new Vector3d();\r
- if (u.hasOffsets) {\r
- u.dir.normalize();\r
- for (PipeControlPoint icp : u.list) {\r
- if (icp.isInstanceOf(ProcessResource.plant3Dresource.OffsettingPoint)) {\r
- offset.add(ControlPointTools.getSizeChangeOffsetVector(icp,u.dir));\r
- }\r
- else if (icp.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint)) \r
- ErrorLogger.defaultLogError("Updating pipe run, found offset controlpoint " + icp.getResource(), new Exception("ASSERT!"));\r
- }\r
- }\r
- u.offset = offset;\r
- checkExpandPathLeg(u,PathLegUpdateType.NONE);\r
- }\r
- \r
- private static void ppNoDir(PipeControlPoint start, Point3d startPoint,ArrayList<PipeControlPoint> list, PipeControlPoint end,Point3d endPoint, boolean hasOffsets,int iter,boolean reversed, ArrayList<ExpandIterInfo> toRemove, PipeControlPoint updated) {\r
- if (DEBUG)System.out.println("PipingRules.ppNoDir() " + start.getResource() + " " + end.getResource() + " " + iter + " " + toRemove.size());\r
- // FIXME : extra loop (dir should be calculated here)\r
- Vector3d dir = new Vector3d();\r
- Vector3d offset = new Vector3d();\r
- hasOffsets = calculateOffset(startPoint, endPoint, list, dir, offset);\r
- ppNoOffset(new UpdateStruct2(start, startPoint, list, end, endPoint, dir, null, hasOffsets, iter, reversed, toRemove,updated));\r
- }\r
- \r
- private static void checkExpandPathLeg(UpdateStruct2 u, PathLegUpdateType lengthChange) {\r
- if (DEBUG)System.out.println("PipingRules.checkExpandPathLeg() " + u + " " + lengthChange);\r
- if (lengthChange != PathLegUpdateType.NONE) {\r
- // FIXME : turns cannot be checked before inline cps are updated, since their position affects calculation of turns \r
- processPathLeg(u,false,false);\r
- int type = checkTurns(u,lengthChange);\r
- if (type == REMOVE_NONE) {\r
- processPathLeg(u,false,true);\r
- } else {\r
- expandPathLeg(u, type);\r
- }\r
- } else {\r
- processPathLeg(u,false,true);\r
- }\r
- }\r
- \r
- private static void updateDirectedPathLeg(UpdateStruct2 u, PathLegUpdateType lengthChange) {\r
- if (DEBUG)System.out.println("PipingRules.updateDirectedPipeRun() " + u + " " + lengthChange);\r
- PipeControlPoint dcp;\r
- PipeControlPoint other;\r
- boolean canMoveOther = false;\r
- boolean dcpStart = false;\r
- Point3d position;\r
- if (u.start.isInstanceOf(ProcessResource.plant3Dresource.DirectedControlPoint)) {\r
- dcp = u.start;\r
- other = u.end;\r
- position = u.startPoint;\r
- dcpStart = true;\r
- if (!u.reversed)\r
- canMoveOther = true;\r
- } else {\r
- dcp = u.end;\r
- other = u.start;\r
- position = u.endPoint;\r
- if (u.reversed)\r
- canMoveOther = true;\r
- }\r
-\r
- Vector3d directedDirection = ControlPointTools.getDirectedControlPointDirection(dcp);\r
- Point3d directedEndPoint = new Point3d(u.endPoint);\r
- if (u.hasOffsets)\r
- directedEndPoint.add(u.offset);\r
-\r
- double mu[] = new double[2];\r
-\r
- Vector3d closest;\r
- Vector3d t = new Vector3d();\r
- \r
- if (dcpStart) {\r
- closest = MathTools.closestPointOnStraight(directedEndPoint, u.startPoint, directedDirection, mu);\r
- t.sub(closest, directedEndPoint);\r
- } else {\r
- closest = MathTools.closestPointOnStraight(u.startPoint, directedEndPoint, directedDirection, mu);\r
- t.sub(closest, u.startPoint);\r
- }\r
-\r
- \r
- double distance = t.lengthSquared();\r
- boolean aligned = (distance < 0.001);\r
- if (aligned) {\r
- checkExpandPathLeg(u,lengthChange);\r
- } else {\r
- if (u.iter > 0) {\r
- backIter(u);\r
- } else {\r
- PipeControlPoint nextToMoved;\r
- \r
- if (u.list.size() > 0)\r
- if (dcpStart)\r
- nextToMoved = u.list.get(0);\r
- else\r
- nextToMoved = u.list.get(u.list.size() - 1);\r
- else if (dcpStart)\r
- nextToMoved = u.end;\r
- else\r
- nextToMoved = u.start;\r
- if (other.isInstanceOf(ProcessResource.plant3Dresource.VariableAngleTurnControlPoint)) {\r
- \r
- // TODO calculate needed space from next run end.\r
- if (mu[0] < 1.0) {\r
- if (dcpStart) {\r
- closest.set(u.startPoint); \r
- } else {\r
- closest.set(u.endPoint);\r
- }\r
- closest.add(directedDirection);\r
- }\r
-\r
- if (canMoveOther) {\r
- if (DEBUG)System.out.println("PipingRules.updateDirectedPipeRun() moved end " + other.getResource() + " to " + closest);\r
- ControlPointTools.setWorldPosition(other, closest);\r
- if (dcpStart) {\r
- ppNoOffset(new UpdateStruct2(u.start, u.startPoint, u.list, u.end, new Point3d(closest), directedDirection,null, u.hasOffsets, u.iter, u.reversed, u.toRemove,u.updated));\r
- if (u.end.getNext() != null)\r
- updatePathLegNext(u.end,u.updated,PathLegUpdateType.NEXT);\r
- } else {\r
- ppNoOffset(new UpdateStruct2(u.start, new Point3d(closest), u.list, u.end, u.endPoint, directedDirection,null, u.hasOffsets, u.iter, u.reversed, u.toRemove,u.updated)); \r
- if (u.start.getPrevious() != null)\r
- updatePathLegPrev(u.start,u.updated,PathLegUpdateType.PREV);\r
- }\r
- } else {\r
- // TODO : calculate needed space from next run end.\r
- insertElbowUpdate(u, dcp, nextToMoved, dcpStart, position, directedDirection);\r
- }\r
- } else if (other.isInstanceOf(ProcessResource.plant3Dresource.UndirectedControlPoint) &&\r
- other.getSubPointOf() != null) {\r
- // FIXME : this code was for updating branches\r
- Vector3d bintersect = new Vector3d();\r
- PipeControlPoint bcp = other.getSubPointOf();\r
- if (bcp != null && canMoveOther) {\r
- Point3d bstart = new Point3d();\r
- Point3d bend = new Point3d();\r
- Vector3d bdir = new Vector3d();\r
- ControlPointTools.getInlineControlPointEnds(bcp, bstart, bend, bdir);\r
- Vector3d nintersect = new Vector3d();\r
- \r
- MathTools.intersectStraightStraight(position, directedDirection, bstart,\r
- bdir, nintersect, bintersect, mu);\r
- Vector3d dist = new Vector3d(nintersect);\r
- dist.sub(bintersect);\r
- canMoveOther = mu[1] > 0.0 && mu[1] < 1.0 && dist.lengthSquared() < 0.01;\r
- } else {\r
- // TODO : endControlPoints are undirected: calculcate correct position for it\r
- throw new UnsupportedOperationException("not implemented");\r
- }\r
- if (canMoveOther) { \r
- if (DEBUG) System.out.println("PipingRules.updateDirectedPipeRun() moved end " + other.getResource() + " to " + bintersect);\r
- // is required branch position is in possible range\r
- ControlPointTools.setWorldPosition(bcp, bintersect);\r
- if (dcpStart) {\r
- checkExpandPathLeg(new UpdateStruct2(u.start, u.startPoint, u.list, u.end, new Point3d(bintersect),directedDirection, u.offset, u.hasOffsets, u.iter, u.reversed, u.toRemove,u.updated),lengthChange);\r
- } else {\r
- checkExpandPathLeg(new UpdateStruct2(u.start, new Point3d(bintersect), u.list, u.end, u.endPoint,directedDirection, u.offset, u.hasOffsets, u.iter, u.reversed, u.toRemove,u.updated),lengthChange); \r
- }\r
- } else {\r
- // branch cannot be moved into right position, new turn\r
- // / elbow must be inserted\r
- insertElbowUpdate(u , dcp, nextToMoved, dcpStart, position, directedDirection);\r
- }\r
-\r
- } else { // assume that control point cannot be moved, but can be rotated\r
- insertElbowUpdate(u, dcp, nextToMoved, dcpStart, position, directedDirection);\r
- }\r
- }\r
- }\r
- }\r
- \r
- \r
- \r
- private static void updateDualDirectedPathLeg(UpdateStruct2 u, PathLegUpdateType lengthChange) {\r
- if (DEBUG) System.out.println("PipingRules.updateDualDirectedPipeRun() " + u + " " + lengthChange);\r
-\r
- PipeControlPoint dcp1 = u.start;\r
- PipeControlPoint dcp2 = u.end;\r
- Point3d position1 = u.startPoint;\r
- Point3d position2 = u.endPoint;\r
- Point3d position1offset = new Point3d(position1);\r
- position1offset.sub(u.offset);\r
- Point3d position2offset = new Point3d(position2);\r
- position2offset.add(u.offset);\r
- Vector3d dir1 = ControlPointTools.getDirectedControlPointDirection(dcp1);\r
- Vector3d dir2 = ControlPointTools.getDirectedControlPointDirection(dcp2);\r
- Vector3d p1 = MathTools.closestPointOnStraight(position1offset, position2, dir2);\r
- Vector3d p2 = MathTools.closestPointOnStraight(position2offset, position1, dir1);\r
- double d1 = position1.distance(new Point3d(p1));\r
- double d2 = position2.distance(new Point3d(p2));\r
-\r
- boolean aligned = (d1 < 0.01 && d2 < 0.01);\r
- if (aligned) {\r
- processPathLeg(u);\r
- } else {\r
- if (u.iter > 0) {\r
- backIter(u);\r
- } else {\r
- PipeControlPoint dcp;\r
- PipeControlPoint next;\r
- if (!u.reversed) {\r
- dcp = dcp1;\r
- if (u.list.size() > 0)\r
- next = u.list.get(0);\r
- else\r
- next = dcp2;\r
- } else {\r
- dcp = dcp2;\r
- if (u.list.size() > 0)\r
- next = u.list.get(u.list.size() - 1);\r
- else\r
- next = dcp1;\r
- }\r
-\r
- PipeRun pipeline = ControlPointTools.getPipeRun(dcp1);\r
- PipelineComponent elbow1 = PipingTools2.instantiatePipelineComponent(u.start.getGraph(), pipeline.getResource(), ProcessResource.plant3Dresource.Elbow);\r
- PipelineComponent elbow2 = PipingTools2.instantiatePipelineComponent(u.start.getGraph(), pipeline.getResource(), ProcessResource.plant3Dresource.Elbow);\r
- \r
- PipeControlPoint tcp1 = elbow1.getControlPoint();\r
- PipeControlPoint tcp2 = elbow2.getControlPoint();\r
- \r
- // Straight s1 = getStraight(dcp, next);\r
- ControlPointTools.insertControlPoint(tcp1, dcp, next);\r
- // s1 = getStraight(tcp1, next);\r
- ControlPointTools.insertControlPoint(tcp2, tcp1, next);\r
- p1 = G3DTools.getVector(dcp.getLocalPosition());\r
- if (!u.reversed)\r
- p1.add(dir1);\r
- else\r
- p1.add(dir2);\r
- \r
- if (!u.reversed)\r
- p2 = MathTools.closestPointOnStraight(new Point3d(p1), position2, dir2);\r
- else\r
- p2 = MathTools.closestPointOnStraight(new Point3d(p1), position1, dir1);\r
- \r
- ControlPointTools.setWorldPosition(tcp1, p1);\r
- ControlPointTools.setWorldPosition(tcp2, p2);\r
- \r
- if (DEBUG) System.out.println("PipingRules.updateDualDirectedPipeRun() created two turns " + tcp1.getResource() + " " + tcp2.getResource());\r
-\r
- if (!u.reversed) {\r
- Vector3d dd = new Vector3d(p2);\r
- dd.sub(p1);\r
- dir2.negate();\r
- processPathLeg(new UpdateStruct2(u.start, u.startPoint,new ArrayList<PipeControlPoint>(), tcp1, new Point3d(p1),dir1, new Vector3d(), false, 0, false,new ArrayList<ExpandIterInfo>(), u.updated));\r
- processPathLeg(new UpdateStruct2(tcp1,new Point3d(p1), new ArrayList<PipeControlPoint>(),tcp2, new Point3d(p2), dd,new Vector3d(), false, 0, false,new ArrayList<ExpandIterInfo>(), u.updated));\r
- // offset is recalculated\r
- processPathLegNoOffset(new UpdateStruct2(tcp2, new Point3d(p2), u.list,u.end, u.endPoint, dir2, null, u.hasOffsets,u.iter, u.reversed, u.toRemove, u.updated));\r
- } else {\r
- Vector3d dd = new Vector3d(p1);\r
- dd.sub(p2);\r
- dir2.negate();\r
- processPathLeg(new UpdateStruct2(tcp1,new Point3d(p1), new ArrayList<PipeControlPoint>(),u.end, u.endPoint, dir2, new Vector3d(), false, 0,false, new ArrayList<ExpandIterInfo>(), u.updated));\r
- processPathLeg(new UpdateStruct2(tcp2,new Point3d(p2), new ArrayList<PipeControlPoint>(),tcp1, new Point3d(p1), dd,new Vector3d(), false, 0, false,new ArrayList<ExpandIterInfo>(), u.updated));\r
- // offset is recalculated\r
- processPathLegNoOffset(new UpdateStruct2(u.start, u.startPoint,u.list, tcp2, new Point3d(p2),dir1, null, u.hasOffsets, u.iter, u.reversed,u.toRemove, u.updated));\r
- }\r
- }\r
- }\r
- }\r
- \r
- private static void insertElbowUpdate(UpdateStruct2 u, PipeControlPoint dcp, PipeControlPoint next, boolean dcpStart, Point3d position, Vector3d directedDirection) {\r
- \r
- Vector3d closest = new Vector3d(position);\r
- closest.add(directedDirection);\r
- PipeControlPoint tcp = insertElbow(dcp, next, new Point3d(closest));\r
-\r
- if (DEBUG) System.out.println("PipingRules.updateDirectedPipeRun() inserted " + tcp.getResource());\r
- \r
- if (dcpStart) {\r
- // update pipe run from new turn to other end\r
- ppNoDir(tcp, new Point3d(closest), u.list, u.end, u.endPoint, u.hasOffsets, u.iter, u.reversed, u.toRemove, u.updated);\r
- // update pipe run from directed to new turn\r
- processPathLeg(new UpdateStruct2(u.start, u.startPoint, new ArrayList<PipeControlPoint>(), tcp, new Point3d(closest), directedDirection, new Vector3d(), false, 0, false, new ArrayList<ExpandIterInfo>(),u.updated)); \r
- } else {\r
- // update pipe run from other end to new turn\r
- ppNoDir(u.start, u.startPoint, u.list, tcp, new Point3d(closest), u.hasOffsets, u.iter, u.reversed, u.toRemove,u.updated);\r
- // update pipe run from new turn to directed\r
- processPathLeg(new UpdateStruct2(tcp, new Point3d(closest), new ArrayList<PipeControlPoint>(), u.end, u.endPoint, directedDirection, new Vector3d(), false, 0, false, new ArrayList<ExpandIterInfo>(),u.updated));\r
- }\r
- }\r
- \r
- /**\r
- * Checks if turns can be removed (turn angle near zero)\r
- */\r
- private static int checkTurns(UpdateStruct2 u, PathLegUpdateType lengthChange) {\r
- if (DEBUG)\r
- System.out.println("PipingRules.checkTurns() " + u.start.getResource()\r
- + " " + u.end.getResource());\r
- boolean startRemoved = false;\r
- boolean endRemoved = false;\r
- if (u.start.isInstanceOf(ProcessResource.plant3Dresource.VariableAngleTurnControlPoint)) {\r
- // this won't work properly if inline control points are not updated\r
- PipeControlPoint startPrev = u.start.getPrevious();\r
- if (startPrev != null) {\r
- double a;\r
- if (!u.hasOffsets) {\r
- a = updateTurnControlPointTurn( u.start, startPrev, u.end);\r
- } else {\r
- Point3d ep = new Point3d(u.endPoint);\r
- ep.add(u.offset);\r
- a = updateTurnControlPointTurn( u.start,u.startPoint, G3DTools.getPoint(startPrev.getLocalPosition()), ep);\r
-\r
- }\r
- if (a < MIN_TURN_ANGLE)\r
- startRemoved = true;\r
- else if (lengthChange == PathLegUpdateType.PREV || lengthChange == PathLegUpdateType.PREV_S){\r
- PathLegUpdateType type;\r
- if (lengthChange == PathLegUpdateType.PREV_S)\r
- type = PathLegUpdateType.PREV;\r
- else\r
- type = PathLegUpdateType.NONE;\r
- updatePathLegPrev(u.start, u.start, type);\r
- }\r
- }\r
- }\r
- if (u.end.isInstanceOf(ProcessResource.plant3Dresource.VariableAngleTurnControlPoint)) {\r
-\r
- PipeControlPoint endNext = u.end.getNext();\r
- if (endNext != null) {\r
- double a;\r
- if (!u.hasOffsets) {\r
- a = updateTurnControlPointTurn(u.end,u.start, endNext);\r
- } else {\r
- Point3d sp = new Point3d(u.startPoint);\r
- sp.sub(u.offset);\r
- a = updateTurnControlPointTurn(u.end, u.endPoint, sp, G3DTools.getPoint(endNext.getLocalPosition()));\r
- }\r
- if (a < MIN_TURN_ANGLE)\r
- endRemoved = true;\r
- else if (lengthChange == PathLegUpdateType.NEXT || lengthChange == PathLegUpdateType.NEXT_S){\r
- PathLegUpdateType type;\r
- if (lengthChange == PathLegUpdateType.NEXT_S)\r
- type = PathLegUpdateType.NEXT;\r
- else\r
- type = PathLegUpdateType.NONE;\r
- updatePathLegNext(u.end, u.end,type);\r
- }\r
- }\r
- }\r
- if (DEBUG)\r
- System.out.println("PipingRules.checkTurns() res " + startRemoved + " " + endRemoved);\r
- if (!startRemoved && !endRemoved)\r
- return REMOVE_NONE;\r
- if (startRemoved && endRemoved)\r
- return REMOVE_BOTH;\r
- if (startRemoved)\r
- return REMOVE_START;\r
- return REMOVE_END;\r
- }\r
- \r
- /**\r
- * Expands piperun search over turns that are going to be removed\r
- * \r
- */\r
- private static void expandPathLeg(UpdateStruct2 u, int type) {\r
- if (DEBUG) System.out.println("PipingRules.expandPipeline " + u.start.getResource() + " " + u.end.getResource());\r
- ArrayList<PipeControlPoint> newList = new ArrayList<PipeControlPoint> ();\r
- switch (type) {\r
- case REMOVE_NONE :\r
- throw new RuntimeException("Error in piping rules");\r
- case REMOVE_START :\r
- u.toRemove.add(new ExpandIterInfo(u.start,REMOVE_START));\r
- u.start = ControlPointTools.findPreviousEnd(u.start);\r
- u.startPoint = G3DTools.getPoint(u.start.getLocalPosition());\r
- ControlPointTools.findNextEnd(u.start,newList);\r
- newList.addAll(u.list);\r
- u.list = newList;\r
- break;\r
- case REMOVE_END :\r
- u.toRemove.add(new ExpandIterInfo(u.end,REMOVE_END));\r
- u.end = ControlPointTools.findNextEnd(u.end,newList);\r
- u.endPoint = G3DTools.getPoint(u.end.getLocalPosition());\r
- u.list.addAll(newList);\r
- break;\r
- case REMOVE_BOTH :\r
- u.toRemove.add(new ExpandIterInfo(u.start,u.end));\r
- u.start = ControlPointTools.findPreviousEnd(u.start);\r
- u.startPoint = G3DTools.getPoint(u.start.getLocalPosition());\r
- ControlPointTools.findNextEnd(u.start,newList);\r
- newList.addAll(u.list);\r
- u.list = newList;\r
- newList = new ArrayList<PipeControlPoint> ();\r
- u.end = ControlPointTools.findNextEnd(u.end,newList);\r
- u.endPoint = G3DTools.getPoint(u.end.getLocalPosition());\r
- u.list.addAll(newList);\r
- break;\r
- default:\r
- throw new RuntimeException("Error in piping rules");\r
- \r
- }\r
- u.offset = new Vector3d();\r
- if (u.hasOffsets) {\r
- u.dir.normalize();\r
- for (PipeControlPoint icp : u.list) {\r
- if (icp.isInstanceOf(ProcessResource.plant3Dresource.OffsettingPoint)) {\r
- u.offset.add(ControlPointTools.getSizeChangeOffsetVector(icp,u.dir));\r
- }\r
- else if (icp.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint)) \r
- ErrorLogger.defaultLogError("Updating pipe run, found offset controlpoint " + icp.getResource(), new Exception("ASSERT!"));\r
- }\r
- }\r
- if (DEBUG) System.out.println("PipingRules.expandPipeline expanded " + u.start.getResource() + " " + u.end.getResource());\r
- u.iter++;\r
- updatePathLeg(u,PathLegUpdateType.NONE);\r
- }\r
- \r
- /**\r
- * reverts one iteration of turn removing back)\r
- */\r
- private static void backIter(UpdateStruct2 u) {\r
- \r
- if (DEBUG) System.out.println("PipingRules.backIter" + u.start.getResource() + " " + u.end.getResource()); \r
- if (u.iter == 0)\r
- throw new RuntimeException("Error in piping rules");\r
- ExpandIterInfo info = u.toRemove.get(u.toRemove.size()-1);\r
- u.toRemove.remove(u.toRemove.size()-1);\r
- if (info.getType() == REMOVE_START || info.getType() == REMOVE_BOTH) {\r
- while (u.list.size() > 0) {\r
- PipeControlPoint icp = u.list.get(0);\r
- if (icp.getPrevious().getResource().equals(info.getStart().getResource())) \r
- break;\r
- u.list.remove(icp);\r
- }\r
- u.start = info.getStart(); \r
- } \r
- if (info.getType() == REMOVE_END || info.getType() == REMOVE_BOTH) {\r
- while (u.list.size() > 0) {\r
- PipeControlPoint icp = u.list.get(u.list.size() - 1);\r
- if (icp.getNext().getResource().equals(info.getEnd().getResource())) \r
- break;\r
- u.list.remove(icp);\r
- }\r
- u.end = info.getEnd();\r
- }\r
- u.offset = new Vector3d();\r
- if (u.hasOffsets) {\r
- u.dir.normalize();\r
- for (PipeControlPoint icp : u.list) {\r
- if (icp.isInstanceOf(ProcessResource.plant3Dresource.OffsettingPoint)) {\r
- u.offset.add(ControlPointTools.getSizeChangeOffsetVector(icp,u.dir));\r
- }\r
- else if (icp.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint)) \r
- ErrorLogger.defaultLogError("Updating pipe run, found offset controlpoint " + icp.getResource(), new Exception("ASSERT!"));\r
- }\r
- }\r
- processPathLeg(u);\r
- \r
- }\r
- \r
- /**\r
- * Processes pipe run (removes necessary turns and updates run ends)\r
- */\r
- // private static void processPathLeg(PipeControlPoint start, Point3d startPoint,ArrayList<InlineControlPoint> list, PipeControlPoint end,Point3d endPoint, Vector3d dir,Vector3d offset, boolean hasOffsets,int iter, boolean reversed, ArrayList<ExpandIterInfo> toRemove) throws TransactionException {\r
- \r
- private static void processPathLeg(UpdateStruct2 u) {\r
- if (DEBUG) System.out.println("PipingRules.processPathLeg " + u.start.getResource() + " " + u.end.getResource());\r
- processPathLeg(u, true, true);\r
- }\r
- \r
- \r
- private static void processPathLeg(UpdateStruct2 u, boolean updateEnds, boolean updateInline) {\r
- if (DEBUG) System.out.println("PipingRules.processPathLeg " + u.start.getResource() + " " + u.end.getResource());\r
- if (u.toRemove.size() > 0) {\r
- for (ExpandIterInfo info : u.toRemove) {\r
- if (info.getStart() != null) {\r
- ControlPointTools.removeControlPoint(info.getStart());\r
- }\r
- if (info.getEnd() != null) {\r
- ControlPointTools.removeControlPoint(info.getEnd());\r
- }\r
- }\r
- // ControlPointTools.removeControlPoint may remove mo0re than one CP;\r
- // we must populate inline CP list again.\r
- u.list.clear();\r
- ControlPointTools.findNextEnd(u.start, u.list);\r
- }\r
- // FIXME : inline CPs are update twice because their positions must be updated before and after ends. \r
- updateInlineControlPoints(u,false);\r
- if (updateEnds) {\r
- if (u.start.isInstanceOf(ProcessResource.plant3Dresource.TurnControlPoint)) {\r
- updateTurnControlPointTurn(u.start, u.start.getPrevious(), u.start.getNext());\r
- updatePathLegPrev(u.start, u.start, PathLegUpdateType.NONE);\r
- } else if (u.start.isInstanceOf(ProcessResource.plant3Dresource.EndComponentControlPoint)) {\r
- updateEndComponentControlPoint(u.start, u.startPoint, u.endPoint);\r
- }\r
- if (u.end.isInstanceOf(ProcessResource.plant3Dresource.TurnControlPoint)) {\r
- updateTurnControlPointTurn( u.end, u.end.getPrevious(), u.end.getNext());\r
- updatePathLegNext(u.end, u.end, PathLegUpdateType.NONE);\r
- } else if (u.end.isInstanceOf(ProcessResource.plant3Dresource.EndComponentControlPoint)) {\r
- updateEndComponentControlPoint(u.end, u.startPoint, u.endPoint);\r
- }\r
- \r
- } else {\r
- if (u.start.isInstanceOf(ProcessResource.plant3Dresource.EndComponentControlPoint)) {\r
- updateEndComponentControlPoint(u.start, u.startPoint, u.endPoint);\r
- }\r
- if (u.end.isInstanceOf(ProcessResource.plant3Dresource.EndComponentControlPoint)) {\r
- updateEndComponentControlPoint( u.end, u.startPoint, u.endPoint);\r
- }\r
- }\r
- if(updateInline)\r
- updateInlineControlPoints(u,true);\r
- \r
- }\r
- \r
- /**\r
- * Processes pipe run and recalculates offset\r
- */\r
- //private static void processPathLeg(PipeControlPoint start, Point3d startPoint,ArrayList<InlineControlPoint> list, PipeControlPoint end,Point3d endPoint, Vector3d dir, boolean hasOffsets,int iter, boolean reversed, ArrayList<ExpandIterInfo> toRemove) throws TransactionException {\r
- private static void processPathLegNoOffset(UpdateStruct2 u) {\r
- if (DEBUG) System.out.println("PipingRules.processPathLeg " + u.start.getResource() + " " + u.end.getResource());\r
- Vector3d offset = new Vector3d();\r
- if (u.hasOffsets) {\r
- u.dir.normalize();\r
- for (PipeControlPoint icp : u.list) {\r
- if (icp.isInstanceOf(ProcessResource.plant3Dresource.OffsetComponent)) {\r
- offset.add(ControlPointTools.getSizeChangeOffsetVector(icp,u.dir));\r
- } else if (icp.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint)) {\r
- ErrorLogger.defaultLogError("Updating pipe run, found offset controlpoint " + icp.getResource(), new Exception("ASSERT!"));\r
- }\r
- }\r
- } \r
- processPathLeg(u);\r
- }\r
- \r
- private static void updateOffsetPoint(PipeControlPoint sccp, Vector3d offset) {\r
- Point3d world = G3DTools.getPoint(sccp.getWorldPosition());\r
- world.add(offset);\r
- PipeControlPoint ocp = sccp.getSubPoint().iterator().next();\r
- ControlPointTools.setWorldPosition(ocp, world);\r
- }\r
- \r
- private static void updatePathLegPrev(PipeControlPoint start, PipeControlPoint updated, PathLegUpdateType lengthChange) {\r
- ArrayList<PipeControlPoint> list = new ArrayList<PipeControlPoint>();\r
- PipeControlPoint end = ControlPointTools.findPreviousEnd(start,list);\r
- updatePathLegPrev(start, list, end,updated,lengthChange);\r
- }\r
- \r
- private static void updatePathLegPrev(PipeControlPoint start, ArrayList<PipeControlPoint> list, PipeControlPoint end, PipeControlPoint updated, PathLegUpdateType lengthChange) {\r
- // reverses the list\r
- ArrayList<PipeControlPoint> nextList = new ArrayList<PipeControlPoint>();\r
- for (PipeControlPoint icp : list) {\r
- if (icp.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint)) {\r
- nextList.add(0, icp.getSubPointOf());\r
- } else {\r
- nextList.add(0,icp);\r
- }\r
- \r
- }\r
- updatePathLeg(end, nextList, start, true,0,new ArrayList<ExpandIterInfo>(),updated,lengthChange);\r
- \r
- }\r
-\r
- \r
- /**\r
- * Updates InlineControlPoints position when straight pipe's end(s) have\r
- * been changed)\r
- * \r
- * @param pipeline\r
- * @param icp\r
- * @param nextPoint\r
- * @param prevPoint\r
- */\r
- private static void updateInlineControlPoint( PipeControlPoint icp, Point3d nextPoint, Point3d prevPoint, Vector3d dir) {\r
- if (DEBUG) System.out.println("PipingRules.updateInlineControlPoint() " + icp.getResource());\r
- \r
- Point3d inlinePoint = G3DTools.getPoint(icp.getLocalPosition());\r
- if (DEBUG) System.out.print("InlineControlPoint update "+icp.getResource() + " " + inlinePoint + " " + prevPoint + " " + nextPoint);\r
- Vector3d newInlinePoint = null;\r
- boolean branchUpdate = false;\r
- PipeControlPoint becp = null;\r
- for (PipeControlPoint pcp : icp.getSubPoint())\r
- if (pcp.isInstanceOf(ProcessResource.plant3Dresource.UndirectedControlPoint)) {\r
- branchUpdate = true;\r
- becp = pcp;\r
- break;\r
- }\r
- \r
- if (DUMMY || !branchUpdate) {\r
- newInlinePoint = MathTools.closestPointOnEdge(new Vector3d(inlinePoint), new Vector3d(nextPoint), new Vector3d(prevPoint));\r
- } else {\r
- \r
- // FIXME : can only handle one branch\r
- PipeControlPoint p = null;\r
- if (becp.getNext() != null) {\r
- p = ControlPointTools.findNextEnd(becp);\r
- } else if (becp.getPrevious() != null) {\r
- p = ControlPointTools.findPreviousEnd(becp);\r
- } \r
- if (p == null) {\r
- newInlinePoint = MathTools.closestPointOnEdge(new Vector3d(inlinePoint), new Vector3d(nextPoint), new Vector3d(prevPoint));\r
- } else {\r
- Point3d branchLegEnd = G3DTools.getPoint(p.getLocalPosition());\r
- Vector3d dir2 = new Vector3d(inlinePoint);\r
- dir2.sub(branchLegEnd);\r
- Vector3d dir1 = new Vector3d(nextPoint);\r
- dir1.sub(prevPoint);\r
- newInlinePoint = new Vector3d();\r
- double mu[] = new double[2];\r
- MathTools.intersectStraightStraight(new Vector3d(prevPoint), dir1, new Vector3d(branchLegEnd), dir2, newInlinePoint, new Vector3d(),mu);\r
- if (DEBUG) System.out.println(mu[0]);\r
- // FIXME : reserve space \r
- if (mu[0] < 0.0) {\r
- newInlinePoint = new Vector3d(prevPoint);\r
- } else if (mu[0] > 1.0) {\r
- newInlinePoint = new Vector3d(nextPoint);\r
- }\r
- }\r
- }\r
- if (DEBUG) System.out.println(" " + newInlinePoint);\r
- \r
- ControlPointTools.setWorldPosition(icp, newInlinePoint);\r
- updateControlPointOrientation(icp);\r
- }\r
- \r
- /**\r
- * Updates InlineControlPoints position when straight pipe's end(s) have\r
- * been changed)\r
- * \r
- * @param pipeline\r
- * @param icp\r
- * @param nextPoint\r
- * @param prevPoint\r
- */\r
- private static void updateEndComponentControlPoint( PipeControlPoint ecp, Point3d start, Point3d end) {\r
- if (DEBUG) System.out.println("PipingRules.updateEndComponentControlPoint() " + ecp.getResource());\r
-// PipeControlPoint next = ecp.getNext();\r
-// PipeControlPoint prev = ecp.getPrevious();\r
-// if (next != null) {\r
-// end = G3DTools.getPoint(next.getLocalPosition());\r
-// start = G3DTools.getPoint(ecp.getLocalPosition());\r
-// } else if (prev != null) {\r
-// end = G3DTools.getPoint(ecp.getLocalPosition());\r
-// start = G3DTools.getPoint(prev.getLocalPosition());\r
-// } else {\r
-// // TODO : warning?\r
-// return;\r
-// }\r
- //Vector3d dir = new Vector3d (end);\r
- //dir.sub(start);\r
- //dir.normalize();\r
- //G3DTools.setTuple(ecp.getDirection(), dir);\r
- \r
- updateControlPointOrientation(ecp);\r
- \r
- for (PipeControlPoint pcp : ecp.getSubPoint()) {\r
- // TODO update position\r
- updatePathLegEndControlPoint(pcp);\r
- }\r
- }\r
- \r
- private static void updateControlPointOrientation(PipeControlPoint pcp) {\r
- // FIXME : hack to bypass variable length components orientation\r
- if (pcp.getAtMostOneRelatedObject(ProcessResource.g3dResource.HasWorldOrientation) == null)\r
- return;\r
- Double angleO = pcp.getAtMostOneRelatedScalarDouble(ProcessResource.plant3Dresource.HasRotationAngle);\r
- double angle = 0.0;\r
- if (angleO != null)\r
- angle = angleO;\r
- \r
- AxisAngle4d aa = ControlPointTools.getControlPointWorldRotation(pcp, angle);\r
- ControlPointTools.setWorldOrientation(pcp,aa);\r
- \r
- }\r
-\r
- /**\r
- * Updates all branches when branch's position has been changed\r
- * @param bcp\r
- */\r
- private static void updateBranchControlPointBranches(PipeControlPoint bcp) {\r
- if (DEBUG) System.out.println("PipingRules.updateBranchControlPointBranches() " + bcp.getResource());\r
- Collection<PipeControlPoint> branches = bcp.getSubPoint();\r
- if (branches.size() == 0) {\r
- if (DEBUG) System.out.println("No Branches found");\r
- return;\r
- }\r
- for (PipeControlPoint pcp : branches) {\r
- updatePathLegEndControlPoint(pcp);\r
- }\r
- }\r
- \r
- /**\r
- * Recalculates turn control point's internal data (turn angle and offset)\r
- * @param tcp\r
- * @param prev\r
- * @param next\r
- */\r
- private static double updateTurnControlPointTurn( PipeControlPoint tcp, PipeControlPoint prev, PipeControlPoint next) {\r
- if (DEBUG) System.out.println("PipingTools.updateTurnControlPointTurn()" + tcp.getResource());\r
- if (next == null || prev == null)\r
- return Math.PI; // FIXME : argh\r
- Point3d middlePoint = G3DTools.getPoint(tcp.getWorldPosition());\r
- Point3d nextPoint = G3DTools.getPoint(next.getWorldPosition()); \r
- Point3d prevPoint = G3DTools.getPoint(prev.getWorldPosition()); \r
- return updateTurnControlPointTurn(tcp, middlePoint, prevPoint, nextPoint);\r
- }\r
- \r
- /**\r
- * Recalculates turn control point's internal data (turn angle and offset)\r
- * @param tcp\r
- * @param middlePoint\r
- * @param nextPoint\r
- * @param prevPoint\r
- */\r
- private static double updateTurnControlPointTurn( PipeControlPoint tcp, Point3d middlePoint, Point3d prevPoint, Point3d nextPoint) {\r
- \r
- Vector3d dir1 = new Vector3d(middlePoint);\r
- dir1.sub(prevPoint);\r
- Vector3d dir2 = new Vector3d(nextPoint);\r
- dir2.sub(middlePoint);\r
- if (DEBUG) System.out.println("PipingTools.updateTurnControlPointTurn " + tcp.getResource() + " " + prevPoint + " " + middlePoint + " " + nextPoint);\r
- return updateTurnControlPointTurn(tcp, dir1, dir2);\r
- }\r
- \r
- private static double updateTurnControlPointTurn(PipeControlPoint tcp, Vector3d dir1, Vector3d dir2) {\r
- double turnAngle = dir1.angle(dir2);\r
- double angle = Math.PI - turnAngle;\r
- \r
- double elbowRadius = tcp.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasTurnRadius);\r
- double R = elbowRadius / Math.tan(angle * 0.5);\r
- Vector3d turnAxis = new Vector3d();\r
- turnAxis.cross(dir1, dir2);\r
- turnAxis.normalize();\r
- tcp.setRelatedScalarDouble(ProcessResource.plant3Dresource.HasTurnAngle,turnAngle);\r
- tcp.setRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength, R);//setComponentOffsetValue(R);\r
- G3DTools.setTuple3(tcp.getSingleRelatedObject(ProcessResource.plant3Dresource.HasTurnAxis), turnAxis);\r
- if (DEBUG) System.out.println("PipingTools.updateTurnControlPointTurn " + dir1 + " " + dir2 + " " + turnAngle + " " + turnAxis);\r
- return turnAngle;\r
- }\r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.common;\r
-\r
-\r
-public class PipingTools {\r
-// private static final boolean DEBUG = true;\r
-// \r
-//\r
-// \r
-// /**\r
-// * Splits straigth by inserting new controlpoint between straight ends.\r
-// * @param straight\r
-// * @param newPcp\r
-// * @throws TransactionException\r
-// */\r
-//// public static void insertControlPoint(Straight straight, PipeControlPoint newPcp) throws TransactionException {\r
-//// if (straight == null || newPcp == null) {\r
-//// ErrorLogger.defaultLogError("Routing pipe, cannot make branch: straight or control point is null", null);\r
-//// return;\r
-//// }\r
-//// PipeControlPoint scp = straight.getHasControlPoint();\r
-//// PipeControlPoint straightStart = (PipeControlPoint)StubFactory.getStubForResource(straight.getClass().getClassLoader(),scp.getPreviousPoint().getResource());\r
-//// PipeControlPoint straightEnd = (PipeControlPoint)StubFactory.getStubForResource(straight.getClass().getClassLoader(),scp.getNext().getResource());\r
-//// if (DEBUG) System.out.println("PipingTools inserting control point between " + straightStart.getResource() + " " + straightEnd.getResource() + " straight " + straight.getResource());\r
-//// \r
-//// // remove the straight pipe \r
-//// PipeControlPoint temp = PipeControlPointFactory.instantiate(newPcp.getGraph());\r
-//// //straight.setHasNextControlPoint(temp);\r
-//// //straight.setHasPreviousControlPoint(temp); \r
-//// straight.setHasControlPoint(temp);\r
-//// \r
-//// PipeRun pipeRun = getPipeRun(straight);\r
-//// if (pipeRun != null) {\r
-//// pipeRun.getHasSubnodesSet().remove(straight.getResource());\r
-//// }\r
-//// insertControlPoint(pipeRun, newPcp, straightStart, straightEnd);\r
-//// \r
-//// }\r
-// \r
-//\r
-//\r
-// \r
-// \r
-// \r
-// \r
-// \r
-// public static void getStraightPipeEnds(Straight straight, Point3d end1, Point3d end2) {\r
-// getStraightPipeEnds(getPipeRun(straight), straight, end1, end2);\r
-// }\r
-// \r
-// public static void getStraightPipeEnds(PipeRun pipeRun,Straight straight, Point3d end1, Point3d end2) {\r
-// if (DEBUG) System.out.println("PipingTools.getStraightPipeEnds() " + straight.getResource());\r
-// PipeControlPoint scp = straight.getHasControlPoint();\r
-// PipeControlPoint startControlPoint = (PipeControlPoint)StubFactory.getStubForResource(straight.getClass().getClassLoader(),scp.getPrevious().getResource());\r
-// PipeControlPoint endControlPoint = (PipeControlPoint)StubFactory.getStubForResource(straight.getClass().getClassLoader(),scp.getNext().getResource());\r
-// if (startControlPoint == null || endControlPoint == null) {\r
-// ErrorLogger.defaultLogError("Pipe ends null", new NullPointerException());\r
-// }\r
-// // start and end position of the pipe\r
-// // positions may be linked to other components, like nozzles\r
-// // and then their coordinates are in component's local coordinates\r
-// // which must be transformed into pipeRun's local coordinates\r
-// \r
-// //Point3d startPipe = getLocalPoint(pipeRun,startControlPoint);\r
-//\r
-// \r
-// //Point3d endPipe = getLocalPoint(pipeRun, endControlPoint);\r
-// Point3d startPipe = G3DTools.getPoint(startControlPoint.getLocalPosition());\r
-// Point3d endPipe = G3DTools.getPoint(endControlPoint.getLocalPosition());\r
-// if (startPipe == null || endPipe == null) {\r
-// end1.x = Double.NaN;\r
-// end1.y = Double.NaN;\r
-// end1.z = Double.NaN;\r
-// end2.x = Double.NaN;\r
-// end2.y = Double.NaN;\r
-// end2.z = Double.NaN;\r
-// if (DEBUG) System.out.println("no positions");\r
-// return;\r
-// }\r
-// \r
-// Vector3d dir = new Vector3d(endPipe);\r
-// dir.sub(startPipe);\r
-// \r
-//\r
-// if (startControlPoint instanceof TurnControlPoint) {\r
-// TurnControlPoint t = (TurnControlPoint)startControlPoint;\r
-// double R = t.getComponentOffsetValue();\r
-// Vector3d n = new Vector3d(dir);\r
-// n.normalize();\r
-// n.scale(R);\r
-// startPipe.add(n);\r
-// } else if (startControlPoint instanceof InlineControlPoint && !(startControlPoint instanceof BranchControlPoint)) {\r
-// InlineControlPoint t = (InlineControlPoint)startControlPoint;\r
-// double R = t.getNextComponentOffsetValue();\r
-// Vector3d n = new Vector3d(dir);\r
-// n.normalize();\r
-// n.scale(R);\r
-// startPipe.add(n);\r
-// }\r
-//\r
-// if (endControlPoint instanceof TurnControlPoint) {\r
-// TurnControlPoint t = (TurnControlPoint)endControlPoint;\r
-// double R = t.getComponentOffsetValue();\r
-// Vector3d n = new Vector3d(dir);\r
-// n.normalize();\r
-// n.scale(R);\r
-// endPipe.sub(n);\r
-// } else if (endControlPoint instanceof InlineControlPoint && !(endControlPoint instanceof BranchControlPoint)) {\r
-// InlineControlPoint t = (InlineControlPoint)endControlPoint;\r
-// double R = t.getPreviousComponentOffsetValue();\r
-// Vector3d n = new Vector3d(dir);\r
-// n.normalize();\r
-// n.scale(R);\r
-// endPipe.sub(n);\r
-// }\r
-// \r
-// end1.x = startPipe.x;\r
-// end1.y = startPipe.y;\r
-// end1.z = startPipe.z;\r
-// \r
-// end2.x = endPipe.x;\r
-// end2.y = endPipe.y;\r
-// end2.z = endPipe.z;\r
-// \r
-// }\r
-// \r
-// /**\r
-// * Finds direction and ends where inline component, reducer or branch can be moved.\r
-// * @param icp\r
-// * @param s\r
-// * @param e\r
-// * @param d\r
-// */\r
-// public static void getInlineEnds(InlineControlPoint icp, Vector3d s, Vector3d e, Vector3d d) {\r
-// \r
-// PipeControlPoint next = (PipeControlPoint)StubFactory.getStubForResource(icp.getClass().getClassLoader(), icp.getNext().getResource());\r
-// PipeControlPoint prev = (PipeControlPoint)StubFactory.getStubForResource(icp.getClass().getClassLoader(), icp.getPrevious().getResource());\r
-// Vector3d start = G3DTools.getVector(prev.getLocalPosition());\r
-// Vector3d end = G3DTools.getVector(next.getLocalPosition());\r
-// if (icp.getResource().isInstanceOf(GlobalIdMap.get(PSK3DModelingOntologyMapping.SIZE_CHANGE_CONTROL_POINT))) {\r
-// SizeChangeControlPoint sccp = SizeChangeControlPointFactory.create(icp.getResource());\r
-// Vector3d tDir = new Vector3d(G3DTools.getVector(sccp.getLocalPosition()));\r
-// Vector3d offset = getSizeChangeOffsetVector(sccp, tDir);\r
-// end.sub(offset);\r
-// }\r
-// Vector3d dir = new Vector3d(end);\r
-// dir.sub(start);\r
-// Vector3d n = new Vector3d(dir);\r
-// n.normalize();\r
-// \r
-// double offset = icp.getNextComponentOffsetValue();\r
-// if (next instanceof InlineControlPoint) {\r
-// InlineControlPoint ip = (InlineControlPoint) next;\r
-// offset += ip.getPreviousComponentOffsetValue(); \r
-// }\r
-// else if (next instanceof TurnControlPoint) {\r
-// TurnControlPoint tcp = (TurnControlPoint)next;\r
-// offset += tcp.getComponentOffsetValue();\r
-// }\r
-// Vector3d t = new Vector3d(n);\r
-// t.scale(offset);\r
-// end.sub(t);\r
-// \r
-// offset = icp.getPreviousComponentOffsetValue();\r
-// if (prev instanceof InlineControlPoint) {\r
-// InlineControlPoint ip = (InlineControlPoint) prev;\r
-// offset += ip.getPreviousComponentOffsetValue();\r
-// }\r
-// else if (prev instanceof TurnControlPoint) {\r
-// TurnControlPoint tcp = (TurnControlPoint)prev;\r
-// offset += tcp.getComponentOffsetValue();\r
-// }\r
-// t = new Vector3d(n);\r
-// t.scale(offset);\r
-// start.add(t);\r
-// \r
-// dir= new Vector3d(end);\r
-// dir.sub(start);\r
-// \r
-// s.x = start.x;\r
-// s.y = start.y;\r
-// s.z = start.z;\r
-// \r
-// e.x = end.x;\r
-// e.y = end.y;\r
-// e.z = end.z;\r
-// \r
-// d.x = dir.x;\r
-// d.y = dir.y;\r
-// d.z = dir.z;\r
-// \r
-// System.out.println("PipingTools.getInlineEnds() " + s + " " + e + " " + d);\r
-// }\r
-// \r
-// \r
-// public static void setSame(fi.vtt.simantics.layer0.stubs.Double d1, fi.vtt.simantics.layer0.stubs.Double d2) {\r
-// d1.getResource().createRelation(d2.getResource(), GlobalIdMap.get(PSK3DModelingOntologyMapping.IS_SAME_VALUE));\r
-// }\r
-// \r
-// public static void setHalf(fi.vtt.simantics.layer0.stubs.Double d1, fi.vtt.simantics.layer0.stubs.Double d2) {\r
-// d1.getResource().createRelation(d2.getResource(), GlobalIdMap.get(PSK3DModelingOntologyMapping.IS_HALF_OF_THE_VALUE));\r
-// }\r
-// \r
-// \r
-// \r
-\r
-// \r
-//\r
-// \r
-// \r
-// \r
-// \r
-// \r
-// \r
-\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.common;\r
-\r
-import java.util.Collection;\r
-\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.Statement;\r
-import org.simantics.layer0.utils.instantiation.Instance;\r
-import org.simantics.layer0.utils.instantiation.InstanceFactory;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.actions.PositionType;\r
-import org.simantics.processeditor.stubs.Equipment;\r
-import org.simantics.processeditor.stubs.InlineComponent;\r
-import org.simantics.processeditor.stubs.Nozzle;\r
-import org.simantics.processeditor.stubs.PipeControlPoint;\r
-import org.simantics.processeditor.stubs.PipeRun;\r
-import org.simantics.processeditor.stubs.PipelineComponent;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-\r
-\r
-public class PipingTools2 {\r
- private static final boolean DEBUG = false;\r
- public enum Direction{NEXT,PREVIOUS};\r
- \r
-\r
- \r
- /**\r
- * Reverses a piperun by swapping all previous/next connections\r
- * @param pipeRun\r
- */\r
- public static void reversePipeRun(IEntity pipeRun) {\r
-// //FIXME : reducers / size-change / offset-control points\r
-// RelationTypeSet<PipeControlPoint> cps = pipeRun.getHasControlPointSet();\r
-// if (cps.size() == 0)\r
-// return;\r
-// List<PipeControlPoint> list = new ArrayList<PipeControlPoint>();\r
-// PipeControlPoint pcp = cps.iterator().next();\r
-// list.add(pcp);\r
-// PipeControlPoint temp = pcp.getPrevious();\r
-// while (temp != null) {\r
-// list.add(0,temp);\r
-// temp = temp.getPrevious();\r
-// }\r
-// temp = pcp.getNext();\r
-// while (temp != null) {\r
-// list.add(temp);\r
-// temp = temp.getNext();\r
-// }\r
-// // now list contains control points in sorted order.\r
-// // switch order\r
-// for (int i = 0; i < list.size() - 1; i++) {\r
-// PipeControlPoint pcp1 = list.get(i);\r
-// PipeControlPoint pcp2 = list.get(i+1);\r
-// pcp1.setPrevious(pcp2);\r
-// pcp2.setNext(pcp1);\r
-//\r
-// }\r
-// // fix ends\r
-// list.get(0).setNext(null);\r
-// list.get(list.size() - 1).setPrevious(null);\r
-\r
- }\r
-\r
- public static IEntity getPipeRun(IEntity component) {\r
- assert(component.isInstanceOf(ProcessResource.plant3Dresource.PipelineComponent));\r
- return component.getSingleRelatedObject(ProcessResource.g3dResource.HasParent);\r
- }\r
- \r
- /**\r
- * Returns Nozzle of a directed control point\r
- * @param dcp\r
- * @return\r
- */\r
- public static Nozzle getNozzle(PipeControlPoint dcp) {\r
- assert (dcp.isInstanceOf(ProcessResource.plant3Dresource.DirectedControlPoint));\r
- IEntity e = dcp.getControlPointOf();\r
- if (e == null)\r
- return null;\r
- assert (e.isInstanceOf(ProcessResource.plant3Dresource.Nozzle));\r
- return new Nozzle(e);\r
- }\r
- \r
- /**\r
- * Instantiates new pipeline component and all necessary control points for it.\r
- * @param graph\r
- * @param typeResource\r
- * @return\r
- */\r
- public static PipelineComponent instantiatePipelineComponent(Graph graph, Resource pipeRunResource, Resource typeResource) {\r
- IEntity pipeRun = EntityFactory.create(graph,pipeRunResource);\r
- Instance ins = InstanceFactory.getInstanceOfType(graph, typeResource);\r
- Resource instance = ins.instantiate(graph);\r
- PipelineComponent component = new PipelineComponent(graph,instance);\r
- G3DTools.resetTransformation(component);\r
- // copy control point\r
- Collection<Resource> pcps = graph.getObjects(typeResource, ProcessResource.plant3Dresource.HasControlPoint);\r
- assert(pcps.size() == 1);\r
- Collection<Resource> types = graph.getObjects(pcps.iterator().next(), ProcessResource.builtins.InstanceOf);\r
- PipeControlPoint componentPCP = new PipeControlPoint(graph,InstanceFactory.instantiate(graph, types));\r
- component.addStatement(ProcessResource.plant3Dresource.HasControlPoint, componentPCP);\r
- pipeRun.addStatement(ProcessResource.g3dResource.HasChild, component);\r
- pipeRun.addStatement(ProcessResource.plant3Dresource.HasControlPoints, componentPCP);\r
- component.setPipeDiameter(pipeRun.getSingleRelatedObject(ProcessResource.plant3Dresource.HasPipeDiameter));\r
- if (component.isInstanceOf(ProcessResource.plant3Dresource.VariableAngleTurnComponent)) {\r
- setStatement(component, ProcessResource.plant3Dresource.HasTurnRadius, pipeRun.getSingleRelatedObject(ProcessResource.plant3Dresource.HasTurnRadius));\r
- setStatement(componentPCP, ProcessResource.plant3Dresource.HasTurnRadius, pipeRun.getSingleRelatedObject(ProcessResource.plant3Dresource.HasTurnRadius));\r
- setStatement(component, ProcessResource.plant3Dresource.HasTurnAngle, componentPCP.getSingleRelatedObject(ProcessResource.plant3Dresource.HasTurnAngle));\r
- setStatement(component, ProcessResource.plant3Dresource.HasTurnAxis, componentPCP.getSingleRelatedObject(ProcessResource.plant3Dresource.HasTurnAxis)); \r
- }\r
- if (component.getAtMostOneRelatedObject(ProcessResource.plant3Dresource.HasLength) != null) {\r
- setStatement(componentPCP, ProcessResource.plant3Dresource.HasLength, component.getSingleRelatedObject(ProcessResource.plant3Dresource.HasLength));\r
- }\r
- componentPCP.setLocalOrientation(component.getLocalOrientation());\r
- componentPCP.setWorldOrientation(component.getWorldOrientation());\r
- \r
- componentPCP.setLocalPosition(component.getLocalPosition());\r
- componentPCP.setWorldPosition(component.getWorldPosition());\r
- \r
- setStatement(componentPCP, ProcessResource.plant3Dresource.HasPipeDiameter, pipeRun.getSingleRelatedObject(ProcessResource.plant3Dresource.HasPipeDiameter));\r
- setStatement(component, ProcessResource.plant3Dresource.HasPipeDiameter, pipeRun.getSingleRelatedObject(ProcessResource.plant3Dresource.HasPipeDiameter));\r
- \r
- // TODO : instantiate subpoints\r
- \r
- \r
- return component;\r
- }\r
- \r
- public static Nozzle instantiateNozzle(Graph graph, Resource typeResource) {\r
- Instance ins = InstanceFactory.getInstanceOfType(graph, typeResource);\r
- Resource instance = ins.instantiate(graph);\r
- Nozzle n = new Nozzle(graph,instance);\r
- G3DTools.resetTransformation(n);\r
- \r
- // copy control point\r
- Collection<Resource> pcps = graph.getObjects(typeResource, ProcessResource.plant3Dresource.HasControlPoint);\r
- assert(pcps.size() == 1);\r
- Collection<Resource> types = graph.getObjects(pcps.iterator().next(), ProcessResource.builtins.InstanceOf);\r
- PipeControlPoint nozzlePCP = new PipeControlPoint(graph,InstanceFactory.instantiate(graph, types));\r
- n.addStatement(ProcessResource.plant3Dresource.HasControlPoint, nozzlePCP);\r
- nozzlePCP.setLocalOrientation(n.getLocalOrientation());\r
- nozzlePCP.setWorldOrientation(n.getWorldOrientation());\r
- nozzlePCP.setLocalPosition(n.getLocalPosition());\r
- nozzlePCP.setWorldPosition(n.getWorldPosition());\r
- setStatement(nozzlePCP, ProcessResource.plant3Dresource.HasPipeDiameter, n.getSingleRelatedObject(ProcessResource.plant3Dresource.HasPipeDiameter));\r
- nozzlePCP.setPipeDiameter(0.2);\r
- return n;\r
- }\r
- \r
- public static Equipment instantiateEquipment(Graph graph, Resource typeResource) {\r
- Instance ins = InstanceFactory.getInstanceOfType(graph, typeResource);\r
- Resource instance = ins.instantiate(graph);\r
- Equipment equipment = new Equipment(graph, instance);\r
- G3DTools.resetTransformation(equipment);\r
- \r
- IEntity type = EntityFactory.create(graph, typeResource);\r
- IEntity geometricModel = type.getSingleRelatedObject(ProcessResource.plant3Dresource.HasGraphics);\r
- \r
- Collection<IEntity> sizingProperties = geometricModel.getRelatedObjects(ProcessResource.g3dResource.HasSizingParameter);\r
- Collection<Statement> equipmentProperties = equipment.getRelatedStatements(ProcessResource.builtins.HasProperty);\r
- \r
- for (IEntity e : sizingProperties) {\r
- String name = e.getName();\r
- String pName = "Has " + name;\r
- boolean found = false;\r
- for (Statement s : equipmentProperties) {\r
- IEntity predicate = s.getPredicate();\r
- String predicateName = predicate.getName();\r
- if (predicateName.equals(pName)) {\r
- found = true;\r
- break;\r
- }\r
- }\r
- if(!found) {\r
- IEntity rel = getOrCreateRel(graph,name);\r
- equipment.setRelatedScalarDouble(rel, 1.0);\r
- }\r
- }\r
- \r
- // TODO : create nozzles if needed\r
- \r
- return equipment;\r
- }\r
- \r
- private static IEntity getOrCreateRel(Graph graph, String name) {\r
- IEntity rel = null;\r
- try {\r
- Resource relr = graph.getResourceByURI("http://www.vtt.fi/Simantics/Plant3D/1.0/Relations#Has" + name);\r
- rel = EntityFactory.create(graph,relr);\r
- } catch (Exception e) {\r
- Resource relLib = null;\r
- try {\r
- relLib = graph.getResourceByURI("http://www.vtt.fi/Simantics/Plant3D/1.0#Relations");\r
- } catch (Exception e2) {\r
- \r
- }\r
- Resource relr = graph.newResource();\r
- rel = EntityFactory.create(graph, relr);\r
- rel.addStatement(ProcessResource.builtins.SubrelationOf, ProcessResource.g3dResource.HasNonTransformation);\r
- rel.setName("Has " + name);\r
- Resource irelr = graph.newResource();\r
- graph.addStatement(relr,ProcessResource.builtins.InverseOf,irelr);\r
- graph.addStatement(relLib, ProcessResource.builtins.ConsistsOf, relr);\r
- }\r
- return rel;\r
- }\r
- \r
- public static IEntity getLibraryComponentType(IEntity component) {\r
- assert(component.isInstanceOf(ProcessResource.plant3Dresource.LibraryComponent));\r
- // IEntity.getTypes() returns all types, but we want the closest type.\r
- Collection<IEntity> types = component.getRelatedObjects(ProcessResource.builtins.InstanceOf);//component.getTypes();\r
- IEntity type = null;\r
- for (IEntity t : types) {\r
- if (t.isInheritedFrom(ProcessResource.plant3Dresource.LibraryComponent)) {\r
- if (type == null)\r
- type = t;\r
- else\r
- throw new RuntimeException("Cannot find proper type for library component " + component.getResource() );\r
- }\r
- }\r
- return type;\r
- }\r
- \r
- /**\r
- * Splits existing VariableLengthComponent with another component.\r
- * Result is two VariableLengthComponents and inserted component between them.\r
- * \r
- * Note : world position of newComponent must be set before this method may be called.\r
- * \r
- * @param newComponent\r
- * @param splittingComponent\r
- */\r
- public static void splitVariableLengthComponent(IEntity newComponent, IEntity splittingComponent) {\r
- assert(splittingComponent.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthInlineComponent));\r
- assert(newComponent.isInstanceOf(ProcessResource.plant3Dresource.PipelineComponent));\r
- assert(!newComponent.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthInlineComponent));\r
- IEntity newCP = newComponent.getSingleRelatedObject(ProcessResource.plant3Dresource.HasControlPoint);\r
- IEntity splittingCP = splittingComponent.getSingleRelatedObject(ProcessResource.plant3Dresource.HasControlPoint);\r
- IEntity nextCP = splittingCP.getAtMostOneRelatedObject(ProcessResource.plant3Dresource.HasNext);\r
- IEntity prevCP = splittingCP.getAtMostOneRelatedObject(ProcessResource.plant3Dresource.HasPrevious);\r
- \r
- /* there are many different cases to insert new component when\r
- it splits existing VariableLengthinlineComponent.\r
- \r
- 1. VariableLengthComponet is connected from both sides:\r
- - insert new component between VariableLength component and component connected to it\r
- - insert new VariableLengthComponent between inserted component and component selected in previous step\r
- \r
- 2. VariableLengthComponent is connected from one side\r
- - Use previous case or:\r
- - Insert new component to empty end\r
- - Insert new VariableLength component to inserted components empty end\r
- \r
- 3. VariableLength is not connected to any component.\r
- - Should not be possible, at least in current implementation.\r
- - Could be done using second case\r
-\r
- */\r
- \r
- if (nextCP == null && prevCP == null) {\r
- // this should not be possible\r
- throw new RuntimeException("VariableLengthComponent " + splittingComponent.getResource() + " is not connected to anything.");\r
- }\r
- \r
- Point3d next = ControlPointTools.getRealPosition(splittingCP, PositionType.NEXT);\r
- Point3d prev = ControlPointTools.getRealPosition(splittingCP, PositionType.PREVIOUS);\r
- Point3d comp = G3DTools.getPoint(newComponent.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldPosition));\r
- double length = newComponent.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength);\r
- Vector3d dir = new Vector3d(next);\r
- dir.sub(prev);\r
- dir.normalize();\r
- dir.scale(length * 0.5);\r
- Point3d vn = new Point3d(comp);\r
- Point3d vp = new Point3d(comp);\r
- vn.add(dir);\r
- vp.sub(dir);\r
- double ln = vn.distance(next);\r
- double lp = vp.distance(prev);\r
- vp.interpolate(prev, 0.5);\r
- vn.interpolate(next, 0.5);\r
- \r
- IEntity type = getLibraryComponentType(splittingComponent);\r
- \r
- IEntity newVariableLengthComponent = instantiatePipelineComponent(splittingComponent.getGraph(), getPipeRun(splittingComponent).getResource(), type.getResource());\r
- IEntity newVariableLengthCP = newVariableLengthComponent.getSingleRelatedObject(ProcessResource.plant3Dresource.HasControlPoint);\r
- if (nextCP == null) {\r
- ControlPointTools.insertControlPoint(newCP, splittingCP,Direction.NEXT);\r
- ControlPointTools.insertControlPoint(newVariableLengthCP, newCP,Direction.NEXT);\r
- ControlPointTools.setWorldPosition(splittingCP, vp);\r
- splittingCP.setRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength, lp);\r
- ControlPointTools.setWorldPosition(newVariableLengthCP, vn); \r
- newVariableLengthComponent.setRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength, ln);\r
- } else if (prevCP == null) {\r
- ControlPointTools.insertControlPoint(newCP, splittingCP,Direction.PREVIOUS);\r
- ControlPointTools.insertControlPoint(newVariableLengthCP, newCP,Direction.PREVIOUS);\r
- ControlPointTools.setWorldPosition(splittingCP, vn);\r
- splittingCP.setRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength, ln);\r
- ControlPointTools.setWorldPosition(newVariableLengthCP, vp);\r
- newVariableLengthComponent.setRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength, lp);\r
- } else {\r
- ControlPointTools.insertControlPoint(newCP,splittingCP,nextCP);\r
- ControlPointTools.insertControlPoint(newVariableLengthCP, newCP,nextCP);\r
- ControlPointTools.setWorldPosition(splittingCP, vp);\r
- splittingCP.setRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength, lp);\r
- ControlPointTools.setWorldPosition(newVariableLengthCP, vn);\r
- newVariableLengthComponent.setRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength, ln);\r
- }\r
-\r
- }\r
- \r
- /**\r
- * Attaches newComponent into connectedComponent's connectedControlPoint\r
- * @param newComponent\r
- * @param connectedComponent\r
- * @param connectedControlPoint\r
- */\r
- public static void insertComponent(IEntity newComponent, IEntity connectedComponent, IEntity connectedControlPoint, Direction direction) {\r
- assert (newComponent.isInstanceOf(ProcessResource.plant3Dresource.PipelineComponent));\r
- assert (connectedComponent.isInstanceOf(ProcessResource.plant3Dresource.PipelineComponent));\r
- // TODO : piperun check is more complicated, since newComponent and connectedComponent may be SizeChangeComponents \r
- //assert (getPipeRun(connectedComponent).equals(getPipeRun(newComponent)));\r
- \r
- // new control point and its subpoint\r
- IEntity newControlPoint = newComponent.getSingleRelatedObject(ProcessResource.plant3Dresource.HasControlPoint);\r
- ControlPointTools.insertControlPoint(newControlPoint, connectedControlPoint, direction);\r
-// IEntity newSubPoint = null;\r
-// if (newControlPoint.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint))\r
-// newSubPoint = newControlPoint.getSingleRelatedObject(ProcessResource.plant3Dresource.HasSubPoint);\r
-// \r
-// // connected components parent or subpoint \r
-// IEntity connectedSubPoint = null;\r
-// IEntity connectedParentPoint = null;\r
-// if (connectedControlPoint.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint))\r
-// connectedSubPoint = connectedControlPoint.getSingleRelatedObject(ProcessResource.plant3Dresource.HasSubPoint);\r
-// else if (connectedControlPoint.isInstanceOf(ProcessResource.plant3Dresource.DualSubControlPoint))\r
-// connectedParentPoint = connectedControlPoint.getSingleRelatedObject(ProcessResource.plant3Dresource.SubPointOf);\r
-// \r
-// if (direction == Direction.NEXT) {\r
-// assert (connectedSubPoint == null); // if direction is next, connection done to subpoint\r
-// setStatement(connectedControlPoint, ProcessResource.plant3Dresource.HasNext, newControlPoint);\r
-// if (connectedParentPoint != null)\r
-// setStatement(connectedParentPoint, ProcessResource.plant3Dresource.HasNext, newControlPoint);\r
-// setStatement(newControlPoint, ProcessResource.plant3Dresource.HasPrevious, connectedControlPoint);\r
-// if (newSubPoint != null)\r
-// setStatement(newSubPoint, ProcessResource.plant3Dresource.HasPrevious, connectedControlPoint);\r
-// \r
-// } else {\r
-// assert (connectedParentPoint == null); // if direction is prev, connection done to parentpoint\r
-// if (newSubPoint != null) {\r
-// \r
-// }\r
-// }\r
- \r
- /*\r
- private void insertEndComponent() {\r
- activated = false;\r
- Graph coreTC = parent.getGraph();\r
- \r
- if (replace == null)\r
- checkForEndInsertion();\r
- if (replace == null) {\r
- ErrorLogger.defaultLogError("Cannot insert end component",null);\r
- end();\r
- return;\r
- }\r
- G3DNode p = straight.getHasParent();\r
- if (p == null) {\r
- ErrorLogger.defaultLogError("Straight pipe has no parent", new Exception("ASSERT!"));\r
-\r
- } else {\r
- Pipeline pipeline = PipelineFactory.create(p);\r
- coreTC.startTransaction(this);\r
- try {\r
- Vector3d startPoint = GraphicsNodeTools.getVector(replace.getLocalPosition());\r
- EndComponentControlPoint ecp = EndComponentControlPointFactory.instantiate(coreTC);\r
- coreTC.commitChanges(CommitMessage.CHANGE_MESSAGE);\r
- pipeline.getHasControlPointSet().remove(replace);\r
- // create dummy node\r
- //PipeControlPoint pcp = PipeControlPointFactory.instantiate(coreTC);\r
- replace.setNextPoint(null);\r
- replace.setPreviousPoint(null);\r
- pipeline.getHasControlPointSet().add(ecp);\r
- if (next) {\r
- straight.getHasControlPoint().getPreviousPoint().setNextPoint(ecp);\r
- straight.getHasControlPoint().setNextPoint(ecp);\r
- ecp.setPreviousPoint(straight.getHasControlPoint().getPreviousPoint());\r
- //ecp.setNextPoint(null);\r
- } else {\r
- straight.getHasControlPoint().getNextPoint().setPreviousPoint(ecp);\r
- straight.getHasControlPoint().setPreviousPoint(ecp);\r
- ecp.setNextPoint(straight.getHasControlPoint().getNextPoint());\r
- //ecp.setPreviousPoint(null);\r
- }\r
- G3DTools.setTranslation(ecp.getLocalPosition(), startPoint);\r
- // FIXME : component should specify how much space it needs\r
- createAndLink(coreTC, pipeline, ecp);\r
- coreTC.commitChanges(CommitMessage.CHANGE_MESSAGE);\r
- coreTC.commitTransaction(CommitMessage.TRANSACTION_MESSAGE);\r
- } catch (TransactionException e) {\r
- ErrorLogger.defaultLogError("Cannot insert component", e);\r
- coreTC.cancelTransaction();\r
- }\r
- }\r
- \r
- end();\r
- }\r
- \r
- private void insertComponent(Point3d startPoint) {\r
- activated = false;\r
- Graph coreTC = parent.getGraph();\r
- G3DNode p = straight.getHasParent();\r
- if (p == null) {\r
- ErrorLogger.defaultLogError("Straight pipe has no parent", new Exception("ASSERT!"));\r
-\r
- } else {\r
- Pipeline pipeline = PipelineFactory.create(p);\r
- coreTC.startTransaction(this);\r
- try {\r
- InlineComponentControlPoint icp = InlineComponentControlPointFactory.instantiate(coreTC);\r
- coreTC.commitChanges(CommitMessage.CHANGE_MESSAGE);\r
- PipeControlPoint scp = straight.getHasControlPoint();\r
- // it shouldn't matter whitch control point to use, next or previous.\r
- PipingTools.insertControlPoint(pipeline, icp, scp, scp.getNextPoint());\r
- //PipingTools.insertControlPoint(straight, icp);\r
- pipeline.getHasControlPointSet().add(icp);\r
- G3DTools.setTranslation(icp.getLocalPosition(), startPoint);\r
- // FIXME : component should specify how much space it needs\r
- icp.setNextComponentOffsetValue(pipeline.getPipeRadiusValue());\r
- icp.setPreviousComponentOffsetValue(pipeline.getPipeRadiusValue());\r
- PipingTools.setSame(pipeline.getPipeRadius(), icp.getNextComponentOffset());\r
- PipingTools.setSame(pipeline.getPipeRadius(), icp.getPreviousComponentOffset());\r
- createAndLink(coreTC, pipeline, icp);\r
- coreTC.commitChanges(CommitMessage.CHANGE_MESSAGE);\r
- coreTC.commitTransaction(CommitMessage.TRANSACTION_MESSAGE);\r
- } catch (TransactionException e) {\r
- ErrorLogger.defaultLogError("Cannot insert component", e);\r
- coreTC.cancelTransaction();\r
- }\r
- }\r
-\r
- line.removeFromParent();\r
- \r
- end();\r
- \r
- }\r
- \r
- \r
- private void createAndLink(Graph coreTC, Pipeline pipeline, PipeControlPoint icp) throws TransactionException {\r
- PipelineComponent component = PipelineComponentFactory.create(OntologyUtils.instantiate(typeResource));\r
- coreTC.commitChanges(CommitMessage.CHANGE_MESSAGE);\r
- component.setHasControlPoint(icp);\r
- component.setLocalPosition(icp.getLocalPosition());\r
- pipeline.getHasSubnodesSet().add(component);\r
- component.setPipeRadius(pipeline.getPipeRadius());\r
- component.setHasGraphics(GraphicsModelFactory.create(modelResource));\r
- \r
- }\r
- */\r
- \r
- /*\r
- old insert reducer code\r
- \r
- Pipeline pipeline = PipingTools.getPipeline(straight);\r
- // pcp is Turn Control Point and we'll have to change it's type to Size Change Control Point\r
- // First we'll remove its unnecessary properties and elbow connected to it,\r
- RelationTypeSet<Entity> pipeComponents = pcp.getControlPointOfSet();\r
- Resource elbowResource = null;\r
- for (Entity e : pipeComponents) {\r
- if (e.getResource().isInstanceOf(GlobalIdMap.get(PSK3DModelingOntologyMapping.ELBOW))) {\r
- elbowResource = e.getResource();\r
- }\r
- }\r
- if (elbowResource != null) {\r
- pipeComponents.remove(elbowResource);\r
- pipeline.getHasSubnodesSet().remove(elbowResource);\r
- }\r
- RelationSet rs = pcp.getResource().getRelatedResourcesWithRelationIds(GlobalIdMap.get(PSK3DModelingOntologyMapping.HAS_TURN_ANGLE));\r
- RelationReference rr = rs.getRelations()[0];\r
- pcp.getResource().removeRelationById(rr.getObjectId(),rr.getRelationId());\r
- rs = pcp.getResource().getRelatedResourcesWithRelationIds(GlobalIdMap.get(PSK3DModelingOntologyMapping.HAS_COMPONENT_OFFSET));\r
- rr = rs.getRelations()[0];\r
- pcp.getResource().removeRelationById(rr.getObjectId(),rr.getRelationId());\r
- rs = pcp.getResource().getRelatedResourcesWithRelationIds(GlobalIdMap.get(Builtins.InstanceOf));\r
- rr = rs.getRelations()[0];\r
- //pcp.getResource().removeRelationById(type[0], GlobalIdMap.get(Builtins.InstanceOf));\r
- pcp.getResource().removeRelationById(rr.getObjectId(),rr.getRelationId());\r
- Resource sccpType = graph.getResource(PSK3DModelingOntologyMapping.SIZE_CHANGE_CONTROL_POINT);\r
- pcp.createRelation(sccpType, graph.getResource(Builtins.InstanceOf));\r
- \r
- graph.commitChanges(CommitMessage.CHANGE_MESSAGE);\r
- \r
- Reducer reducer = null;\r
- Pipeline newPipeline = PipelineFactory.instantiate(graph);\r
- OffsetControlPoint offsetControlPoint = OffsetControlPointFactory.instantiate(graph);\r
- if (i == 0) {\r
- reducer = ConcentricReducerFactory.instantiate(graph);\r
- } else {\r
- reducer = EccentricReducerFactory.instantiate(graph);\r
- } \r
- graph.commitChanges(CommitMessage.CHANGE_MESSAGE);\r
- SizeChangeControlPoint sccp = SizeChangeControlPointFactory.create(pcp.getResource());\r
- \r
- \r
- // FIXME : lenght, pipe radius and turn angle from specs + let the user choose spec for new pipeline\r
- double reducerLength = 0.3;\r
- reducer.setLengthValue(reducerLength);\r
- double newPipeRadius = pipelineDialog.getPipeRadius();\r
- double newPipeTurnRadius = pipelineDialog.getTurnRadius();\r
-\r
- reducer.setLocalPosition(sccp.getLocalPosition());\r
- reducer.setWorldPosition(sccp.getWorldPosition());\r
- \r
- reducer.setBottomRadiusValue(pipeline.getPipeRadiusValue());\r
- \r
- reducer.setPipeRadius(pipeline.getPipeRadius());\r
- reducer.setTopRadiusValue(newPipeRadius);\r
- newPipeline.setPipeRadiusValue(newPipeRadius);\r
- newPipeline.setTurnRadiusValue(newPipeTurnRadius);\r
- \r
- // reducer is adjuste by pipelines' radiis\r
- PipingTools.setSame(pipeline.getPipeRadius(), reducer.getBottomRadius());\r
- PipingTools.setSame(newPipeline.getPipeRadius(), reducer.getTopRadius());\r
- \r
- //newPipeline.getHasControlPointSet().add(pcp);\r
- sccp.setHasOffsetPoint(offsetControlPoint);\r
- offsetControlPoint.setOffsetPointOf(sccp);\r
- \r
- reducer.setHasControlPoint(sccp);\r
- graph.commitChanges(CommitMessage.CHANGE_MESSAGE);\r
- \r
- sccp.setNextComponentOffsetValue(reducerLength*0.5);\r
- sccp.setPreviousComponentOffsetValue(reducerLength*0.5);\r
- \r
- // offsets are calculated from reducers length\r
- PipingTools.setHalf(reducer.getLength(), sccp.getNextComponentOffset());\r
- PipingTools.setHalf(reducer.getLength(), sccp.getPreviousComponentOffset());\r
- \r
- // linking sccp and ocp offsets\r
- offsetControlPoint.setNextComponentOffset(sccp.getNextComponentOffset());\r
- offsetControlPoint.setPreviousComponentOffset(sccp.getPreviousComponentOffset());\r
- \r
- \r
- offsetControlPoint.setPreviousPoint(sccp.getPreviousPoint());\r
- offsetControlPoint.setNextPoint(sccp.getNextPoint());\r
- if (i == 1) {\r
- // FIXME : link offset value\r
- sccp.setOffsetValue(reducer.getBottomRadiusValue() - reducer.getTopRadiusValue()); \r
- sccp.setAngle(((EccentricReducer)reducer).getAngle());\r
- Vector3d v = PipingTools.getSizeChangeOffsetVector(sccp);\r
- Point3d local = GraphicsNodeTools.getTranslation(sccp.getLocalPosition());\r
- local.add(v);\r
- //Point3d World = GraphicsNodeTools.getTranslation(sccp.getLocalPosition());\r
- GraphicsNodeTools.setTranslation(offsetControlPoint.getLocalPosition(), local);\r
- } else {\r
- // FIXME : is it possible that pipelines are in different coordinate systems \r
- offsetControlPoint.setLocalPosition(sccp.getLocalPosition());\r
- offsetControlPoint.setWorldPosition(sccp.getWorldPosition());\r
- }\r
- ((TestProcessEditor)parent).getPlant().getHasSubnodesSet().add(newPipeline);\r
- pipeline.getHasSubnodesSet().add(reducer);\r
- newPipeline.getHasControlPointSet().add(offsetControlPoint);\r
- graph.commitChanges(CommitMessage.CHANGE_MESSAGE);\r
- \r
- graph.commitTransaction(CommitMessage.TRANSACTION_MESSAGE);\r
- \r
- */\r
- \r
- \r
- \r
- }\r
- \r
- /**\r
- * Returns direction of a nozzle\r
- * @param nozzle\r
- * @return\r
- */\r
- public static Vector3d getNozzleDirection(IEntity nozzle) {\r
- return ControlPointTools.getNozzleDirection(nozzle.getSingleRelatedObject(ProcessResource.g3dResource.HasWorldOrientation));\r
- }\r
- \r
- /**\r
- * Returns true if a nozzle is not connected to a pipe\r
- * @param nozzle\r
- * @return\r
- */\r
- public static boolean isFreeNozzle(IEntity nozzle) {\r
- assert (nozzle.isInstanceOf(ProcessResource.plant3Dresource.Nozzle));\r
- IEntity pcp = nozzle.getSingleRelatedObject(ProcessResource.plant3Dresource.HasControlPoint);\r
- IEntity next = pcp.getAtMostOneRelatedObject(ProcessResource.plant3Dresource.HasNext);\r
- IEntity previous = pcp.getAtMostOneRelatedObject(ProcessResource.plant3Dresource.HasPrevious);\r
- if (next == null && previous == null) {\r
- assert (pcp.getAtMostOneRelatedObject(ProcessResource.plant3Dresource.ControlPointOfPipeRun) == null);\r
- return true;\r
- }\r
- assert (pcp.getAtMostOneRelatedObject(ProcessResource.plant3Dresource.ControlPointOfPipeRun) != null);\r
- return false;\r
- }\r
- \r
- public static void getInlineComponentEnds(IEntity inlineComponent, Point3d p1, Point3d p2) {\r
- assert(inlineComponent.isInstanceOf(ProcessResource.plant3Dresource.InlineComponent));\r
- ControlPointTools.getInlineControlPointEnds(inlineComponent.getSingleRelatedObject(ProcessResource.plant3Dresource.HasControlPoint), p1, p2);\r
- }\r
- \r
- public static void getInlineComponentEnds(IEntity inlineComponent, Point3d p1, Point3d p2, Vector3d dir) {\r
- assert(inlineComponent.isInstanceOf(ProcessResource.plant3Dresource.InlineComponent));\r
- ControlPointTools.getInlineControlPointEnds(inlineComponent.getSingleRelatedObject(ProcessResource.plant3Dresource.HasControlPoint), p1, p2,dir);\r
- }\r
- \r
- public static void getInlineComponentEnds(IEntity inlineComponent, Point3d center, Point3d p1, Point3d p2, Vector3d dir) {\r
- assert(inlineComponent.isInstanceOf(ProcessResource.plant3Dresource.InlineComponent));\r
- ControlPointTools.getInlineControlPointEnds(inlineComponent.getSingleRelatedObject(ProcessResource.plant3Dresource.HasControlPoint), center, p1, p2,dir);\r
- }\r
- \r
- public static void removePipeRun(PipeRun pipeRun) {\r
- if (DEBUG) System.out.println("PipingTools.removePipeRun() " + pipeRun.getResource());\r
- G3DNode parent = pipeRun.getParent();\r
- if (parent != null)\r
- parent.getChild().remove(pipeRun);\r
-\r
- }\r
- /**\r
- * Liks piperun's specs to nozzle's specs\r
- * @param nozzle\r
- * @param piperun\r
- */\r
- public static void linkNozzleAndPipeRun(IEntity nozzle, IEntity piperun) {\r
- assert(nozzle.isInstanceOf(ProcessResource.plant3Dresource.Nozzle));\r
- assert(piperun.isInstanceOf(ProcessResource.plant3Dresource.PipeRun));\r
- IEntity diam = piperun.getSingleRelatedObject(ProcessResource.plant3Dresource.HasPipeDiameter); \r
- \r
- piperun.addStatement(ProcessResource.plant3Dresource.HasControlPoints, nozzle.getSingleRelatedObject(ProcessResource.plant3Dresource.HasControlPoint));\r
- setStatement(nozzle, ProcessResource.plant3Dresource.HasPipeDiameter, diam);\r
- }\r
- \r
- /**\r
- * Unlinks piperun's specs from nozzle's specs.\r
- * @param nozzle\r
- * @param piperun\r
- */\r
- public static void unlinkNozzleAndPiperun(IEntity nozzle, IEntity piperun) {\r
- assert(nozzle.isInstanceOf(ProcessResource.plant3Dresource.Nozzle));\r
- assert(piperun.isInstanceOf(ProcessResource.plant3Dresource.PipeRun));\r
- \r
- piperun.removeStatement(ProcessResource.plant3Dresource.HasControlPoints, nozzle.getSingleRelatedObject(ProcessResource.plant3Dresource.HasControlPoint)); \r
- // get current diameter\r
- double diam = nozzle.getSingleRelatedScalarDouble(ProcessResource.plant3Dresource.HasPipeDiameter);\r
- // remove link to shared diameter resource\r
- nozzle.removeRelatedStatements(ProcessResource.plant3Dresource.HasPipeDiameter);\r
- // create new reource for diameter\r
- nozzle.setRelatedScalarDouble(ProcessResource.plant3Dresource.HasPipeDiameter, diam);\r
- }\r
- \r
- private static void setStatement(IEntity subject, Resource relation, IEntity object) {\r
- subject.removeRelatedStatements(relation);\r
- subject.addStatement(relation, object);\r
- }\r
- \r
- public static void getInlineMovement(InlineComponent ic, Point3d start, Point3d end) {\r
- PipeControlPoint pcp = ic.getControlPoint();\r
- ControlPointTools.getInlineMovement(pcp, start, end);\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.dialogs;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.HashMap;\r
-import java.util.HashSet;\r
-import java.util.Map;\r
-import java.util.Set;\r
-import java.util.TreeMap;\r
-import java.util.Map.Entry;\r
-\r
-import org.eclipse.jface.dialogs.Dialog;\r
-import org.eclipse.jface.dialogs.IDialogConstants;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.SelectionAdapter;\r
-import org.eclipse.swt.events.SelectionEvent;\r
-import org.eclipse.swt.events.SelectionListener;\r
-import org.eclipse.swt.layout.FillLayout;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.layout.GridLayout;\r
-import org.eclipse.swt.widgets.Button;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.List;\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.eclipse.swt.widgets.Text;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
-import org.simantics.animation.stubs.Animation;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.viewpoints.TraversalPath;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.common.PathUtils;\r
-import org.simantics.proconf.browsing.GraphExplorer;\r
-import org.simantics.proconf.g3d.animation.Animatable;\r
-import org.simantics.proconf.g3d.animation.AnimationSystem;\r
-import org.simantics.proconf.g3d.animation.ResourceAnimationController;\r
-import org.simantics.proconf.g3d.animation.ScaledResourceAnimationController;\r
-import org.simantics.proconf.g3d.base.ScenegraphAdapter;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.stubs.G3DModel;\r
-import org.simantics.proconf.g3d.tools.OEPathSelectionListener;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-\r
-public class ConfigureAnimationDialog extends Dialog {\r
- Session session;\r
- List typeList;\r
- List animationList;\r
- java.util.List<Resource> nodes;\r
- Set<Resource> models;\r
- \r
- private Composite oeLabelComposite;\r
- //private Control viewpointControl;\r
- private Composite oeComposite;\r
- private GraphExplorer oe;\r
- private Map<Resource,Resource> instanceModelMap = new HashMap<Resource, Resource>();\r
- private ScenegraphAdapter adapter;\r
- \r
- private Button applyAnimationButton;\r
- \r
- Resource selectedType;\r
- Resource sampleInstance;\r
- Resource sampleSource;\r
- java.util.List<Resource> samplePath;\r
- AnimationSystem animationSystem;\r
- \r
- Button scaleButton;\r
- Text minText;\r
- Text maxText;\r
- \r
- public ConfigureAnimationDialog(Shell parentShell, Session session, java.util.List<Resource> nodes, ScenegraphAdapter adapter, AnimationSystem animationSystem) {\r
- super(parentShell);\r
- this.session = session;\r
- this.nodes = nodes;\r
- models = new HashSet<Resource>();\r
- session.syncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- for (Resource n : ConfigureAnimationDialog.this.nodes) {\r
- IEntity t = EntityFactory.create(g,n);\r
- Collection<IEntity> r = t.getRelatedObjects(ProcessResource.plant3Dresource.HasGraphics);\r
- if (r.size() == 1) {\r
- IEntity model = r.iterator().next();\r
- if (model.isInstanceOf(ProcessResource.g3dResource.G3DModel)) {\r
- models.add(model.getResource());\r
- instanceModelMap.put(n, model.getResource());\r
- } else {\r
- throw new RuntimeException("Expected G3DModel, got something else " + model);\r
- }\r
- } else {\r
- ErrorLogger.getDefault().logWarning("Got node without a model", null);\r
- }\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- this.adapter = adapter;\r
- this.animationSystem = animationSystem;\r
- int shellStyle = getShellStyle();\r
- setShellStyle(shellStyle | SWT.MAX | SWT.RESIZE);\r
- }\r
- \r
- @Override\r
- protected void configureShell(Shell newShell) { \r
- super.configureShell(newShell);\r
- newShell.setText("Configure animations");\r
- \r
- }\r
- \r
- protected Control createDialogArea(Composite parent) {\r
- Composite composite = (Composite) super.createDialogArea(parent);\r
- GridLayout layout = new GridLayout(4,true);\r
- layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);\r
- layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);\r
- layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);\r
- layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);\r
- composite.setLayout(layout);\r
- \r
- Label label = new Label(composite, SWT.WRAP);\r
- label.setText("Types");\r
-// GridData data = new GridData(GridData.GRAB_HORIZONTAL\r
-// | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL\r
-// | GridData.VERTICAL_ALIGN_BEGINNING);\r
- GridData data = new GridData(GridData.CENTER,GridData.FILL,true,false,1,1);\r
- data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);\r
- label.setLayoutData(data);\r
- label.setFont(parent.getFont());\r
- \r
- label = new Label(composite, SWT.WRAP);\r
- label.setText("Models");\r
- label.setLayoutData(data);\r
- label.setFont(parent.getFont());\r
- \r
- label = new Label(composite, SWT.WRAP);\r
- label.setText("Animations");\r
- label.setLayoutData(data);\r
- label.setFont(parent.getFont());\r
- \r
- oeLabelComposite = new Composite(composite,SWT.NONE);\r
- data = new GridData(GridData.CENTER,GridData.FILL,true,false,1,1);\r
- data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);\r
- \r
- oeLabelComposite.setLayoutData(data);\r
- oeLabelComposite.setLayout(new FillLayout(SWT.HORIZONTAL));\r
- //label = new Label(composite, SWT.WRAP);\r
- label = new Label(oeLabelComposite, SWT.WRAP);\r
- label.setText("Animation source");\r
-// label.setLayoutData(data);\r
- label.setFont(parent.getFont());\r
- \r
- typeList = new List(composite, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY | SWT.V_SCROLL);\r
- typeList.setLayoutData(new GridData(GridData.GRAB_VERTICAL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));\r
-// modelList = new List(composite, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY | SWT.V_SCROLL);\r
-// modelList.setLayoutData(new GridData(GridData.GRAB_VERTICAL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));\r
- animationList = new List(composite, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY | SWT.V_SCROLL);\r
- animationList.setLayoutData(new GridData(GridData.GRAB_VERTICAL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));\r
- oeComposite = new Composite(composite,SWT.BORDER);\r
- oeComposite.setLayoutData(new GridData(GridData.GRAB_VERTICAL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));\r
- layout = new GridLayout();\r
- layout.marginWidth = 0;\r
- layout.marginHeight = 0;\r
- oeComposite.setLayout(layout);\r
- \r
- session.asyncRead(new GraphRequestAdapter() {\r
- TreeMap<String, Resource> sorter;\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- Collection<Resource> types = getTypes(g,nodes);\r
- \r
- sorter = new TreeMap<String, Resource>();\r
- for (Resource type : types) {\r
- IEntity t = EntityFactory.create(g,type);\r
- if (t.getRelatedObjects(ProcessResource.plant3Dresource.HasGraphics).size() > 0) {\r
- String key = t.getName();\r
- if (key.equals("")) key = "ERROR (" + type.getResourceId() + ")";\r
- sorter.put(key, type);\r
- }\r
- }\r
- \r
- \r
- \r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- @Override\r
- public void requestCompleted(GraphRequestStatus status) {\r
- getShell().getDisplay().asyncExec(new Runnable(){\r
- @Override\r
- public void run() {\r
- for (Entry<String, Resource> e : sorter.entrySet()) {\r
- typeList.add(e.getKey());\r
- typeList.setData(e.getKey(), e.getValue());\r
- }\r
- }\r
- });\r
- }\r
- });\r
- \r
- typeList.addSelectionListener(new SelectionListener() {\r
- public void widgetSelected(SelectionEvent e) {\r
- session.asyncRead(new GraphRequestAdapter(){\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- String key = typeList.getItem(typeList.getSelectionIndex());\r
- selectType(EntityFactory.create(g,(Resource) typeList.getData(key)));\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- }\r
- public void widgetDefaultSelected(SelectionEvent e) {\r
- }\r
- });\r
- \r
-// modelList.addSelectionListener(new SelectionListener() {\r
-// public void widgetSelected(SelectionEvent e) {\r
-// if (modelList.getSelectionIndex() < 0 || modelList.getSelectionIndex() >= modelList.getItemCount())\r
-// return;\r
-// String key = modelList.getItem(modelList.getSelectionIndex());\r
-// selectModel((GraphicsModel) modelList.getData(key));\r
-// }\r
-// public void widgetDefaultSelected(SelectionEvent e) {\r
-// }\r
-// });\r
- \r
- Composite buttonComposite = new Composite(composite,SWT.NONE);\r
- buttonComposite.setLayoutData(new GridData(GridData.END,GridData.FILL,true,false,4,1));\r
- buttonComposite.setLayout(new FillLayout(SWT.HORIZONTAL));\r
- scaleButton = new Button(buttonComposite,SWT.CHECK);\r
- scaleButton.setText("Scaling");\r
- scaleButton.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- if (scaleButton.getSelection()) {\r
- minText.setEnabled(true);\r
- maxText.setEnabled(true);\r
- } else {\r
- minText.setEnabled(false);\r
- maxText.setEnabled(false);\r
- }\r
- }\r
- });\r
- minText = new Text(buttonComposite,SWT.SINGLE|SWT.BORDER);\r
- minText.setText("0.0");\r
- \r
- maxText = new Text(buttonComposite,SWT.SINGLE|SWT.BORDER);\r
- maxText.setText("1.0");\r
- \r
- minText.setEnabled(false);\r
- maxText.setEnabled(false);\r
- \r
- applyAnimationButton = new Button(buttonComposite,SWT.PUSH);\r
- applyAnimationButton.setText("Apply animation");\r
- applyAnimationButton.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- session.asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- applyAnimation(g);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- }\r
- });\r
- return composite;\r
- }\r
- \r
- /**\r
- * Updates type selection:\r
- * Finds all GraphicsModels that are connected to instances of selected type with HasGraphics-relation\r
- * and lists them in modelList.\r
- *\r
- * @param resource\r
- */\r
- private void selectType(IEntity resource) {\r
- Graph g = resource.getGraph();\r
- selectedType = resource.getResource();\r
- //modelList.removeAll();\r
- animationList.removeAll();\r
- \r
- Collection<IEntity> model = resource.getRelatedObjects(ProcessResource.plant3Dresource.HasGraphics);\r
- if (model.size() != 1)\r
- throw new RuntimeException("Type " + resource + " does not have a model");\r
- \r
- if (oe != null) {\r
- oe.dispose(); \r
- }\r
- sampleInstance = null;\r
- sampleSource = null;\r
- for (Resource n : nodes) {\r
- IEntity t = EntityFactory.create(g,n);\r
- if (t.isInstanceOf(resource.getResource())) {\r
- sampleInstance = n;\r
- break;\r
- }\r
- }\r
- if (sampleInstance != null) {\r
-// oe = new OntologyExplorer("Animation Source",this.getShell(), new OntologyEditorInput(sampleInstance.getId()));\r
-// if(viewpointControl != null && !viewpointControl.isDisposed()) {\r
-// viewpointControl.dispose();\r
-// }\r
-// viewpointControl = oe.getControl(oeLabelComposite, 1, OntologyExplorer.ViewpointSelector, SWT.NONE);\r
-// Control c = oe.getControl(oeComposite, 1, OntologyExplorer.OntologyTree, SWT.SINGLE);\r
-// c.setLayoutData(new GridData(GridData.FILL_BOTH));\r
-// oe.init(null, ViewpointUtils.getModelledHandler(oe.getGraph(), Builtins.DefaultViewpointId), null, ViewLabelProviderDecorationSettings.DEFAULT, new MenuAboutToShowAction(), new NullAdditionAction(), false);\r
-// //oeComposite.layout(true, true);\r
-// oe.setSelectionScheme(new SourceSelectionScheme(oe));\r
-// //oeLabelComposite.layout(true, true);\r
-// oeComposite.getParent().getParent().layout(true,true);\r
- \r
- oe = new GraphExplorer(oeComposite,SWT.SINGLE);\r
- oe.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));\r
- oe.getViewer().addPostSelectionChangedListener(new OEPathSelectionListener(){\r
- @Override\r
- protected void pathSelectionUpdated(java.util.List<TraversalPath> paths) {\r
- if (paths.size() == 0) {\r
- //selectSource(null);\r
- } else {\r
- final TraversalPath path = paths.iterator().next();\r
- session.asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- selectSource(g,path);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- } \r
- }\r
- });\r
- }\r
- \r
-// modelList.redraw();\r
-// animationList.redraw();\r
- selectModel(new G3DModel(model.iterator().next()));\r
- }\r
- \r
- /**\r
- * Selects model and shows model's animations in animationList\r
- * @param model\r
- */\r
- private void selectModel(G3DModel model) {\r
- animationList.removeAll();\r
- \r
- TreeMap<String, Animation> sorter = new TreeMap<String, Animation>();\r
- \r
- Collection<Animation> animations = model.getAnimation();\r
- for (Animation a : animations) {\r
- String key = a.getName();\r
- if (key.equals("")) key = "ERROR (" + a.getResource().getResourceId() + ")";\r
- sorter.put(key, a);\r
- }\r
- \r
- final TreeMap<String, Animation> fa = sorter;\r
- \r
- getShell().getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- for (Entry<String, Animation> e : fa.entrySet()) {\r
- animationList.add(e.getKey());\r
- animationList.setData(e.getKey(), e.getValue());\r
- }\r
- animationList.redraw();\r
- \r
- }\r
- });\r
- \r
- }\r
- \r
- private void selectSource(Graph graph,TraversalPath path) {\r
- //System.out.println(sampleInstance + " " + resource);\r
- \r
- if (path == null) {\r
- sampleSource = null;\r
- return;\r
- } \r
- IEntity t = EntityFactory.create(graph,path.getResource());\r
- if (!t.isInstanceOf(ProcessResource.builtins.Double)) {\r
- sampleSource = null;\r
- } else {\r
- sampleSource = path.getResource();\r
- samplePath = new ArrayList<Resource>();\r
- PathUtils.createPath(samplePath, path ,sampleInstance,sampleSource,oe);\r
- }\r
- }\r
- \r
- \r
- \r
- private void applyAnimation(Graph graph) {\r
- int animationIndex = animationList.getSelectionIndex();\r
- if (sampleInstance == null || sampleSource == null || samplePath == null || animationIndex == -1) {\r
- throw new RuntimeException("Missing required selections");\r
- //return;\r
- }\r
- \r
- java.util.List<Resource> instances = new ArrayList<Resource>();\r
- java.util.List<Resource> sources = new ArrayList<Resource>();\r
- browseOthers(graph,instances, sources);\r
- instances.add(sampleInstance);\r
- sources.add(sampleSource);\r
- \r
- for (int i = 0; i < instances.size(); i++) {\r
- IGraphicsNode n = adapter.getNode(instances.get(i));\r
- if (!(n instanceof Animatable)) {\r
- //throw new RuntimeException("Node is not animatable");\r
- continue;\r
- }\r
-\r
- Animatable animatable = (Animatable) n;\r
- Animation a = (Animation) animationList.getData(animationList.getItem(animationIndex));\r
- if (!animatable.setAnimation(graph,a.getResource())) {\r
- //throw new RuntimeException("Cannot set animation");\r
- continue;\r
- }\r
- ResourceAnimationController c;\r
- if (scaleButton.getSelection()) {\r
- c = new ScaledResourceAnimationController(sources.get(i),Double.parseDouble(minText.getText()),Double.parseDouble(maxText.getText()));\r
- } else {\r
- c = new ResourceAnimationController(sources.get(i));\r
- }\r
- c.addAnimatable(animatable);\r
- animationSystem.add(c);\r
- }\r
- \r
- }\r
- \r
- private void browseOthers(Graph g, java.util.List<Resource> instances,java.util.List<Resource> sources) {\r
- java.util.List<Resource> possibleInstances = new ArrayList<Resource>();\r
- for (Resource n : nodes) {\r
- IEntity t = EntityFactory.create(g,n);\r
- if (t.isInstanceOf(selectedType) && !n.equals(sampleInstance)) {\r
- possibleInstances.add(n.getResource());\r
- }\r
- }\r
- \r
- for (Resource instance : possibleInstances) {\r
- IEntity source = PathUtils.findSimilar(samplePath,EntityFactory.create(g,instance));\r
- if (source != null) {\r
- instances.add(instance);\r
- sources.add(source.getResource());\r
- } else {\r
- ErrorLogger.getDefault().logWarning("Cannot find animation source for " + instance, null);\r
- }\r
- }\r
- }\r
- \r
- \r
- private Collection<Resource> getTypes(Graph g, java.util.List<Resource> instances) {\r
- Set<Resource> types = new HashSet<Resource>();\r
- for (Resource r : instances) {\r
- IEntity t = EntityFactory.create(g,r);\r
- Collection<IEntity> tTypes = t.getTypes();\r
- for (IEntity type : tTypes)\r
- types.add(type.getResource());\r
- }\r
- return types;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.dialogs;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.HashSet;\r
-import java.util.Set;\r
-import java.util.TreeMap;\r
-import java.util.Map.Entry;\r
-\r
-import org.eclipse.jface.dialogs.Dialog;\r
-import org.eclipse.jface.dialogs.IDialogConstants;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.SelectionAdapter;\r
-import org.eclipse.swt.events.SelectionEvent;\r
-import org.eclipse.swt.events.SelectionListener;\r
-import org.eclipse.swt.layout.FillLayout;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.layout.GridLayout;\r
-import org.eclipse.swt.widgets.Button;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.List;\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.viewpoints.TraversalPath;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.common.PathUtils;\r
-import org.simantics.processeditor.monitors.PathContainer;\r
-import org.simantics.proconf.browsing.GraphExplorer;\r
-import org.simantics.proconf.g3d.stubs.G3DModel;\r
-import org.simantics.proconf.g3d.tools.OEPathSelectionListener;\r
-\r
-\r
-public class ConfigureMonitorDialog extends Dialog {\r
- Session session;\r
- List typeList;\r
- java.util.List<Resource> nodes;\r
-\r
- \r
- private Composite oeLabelComposite;\r
- //private Control viewpointControl;\r
- private Composite oeComposite;\r
- private GraphExplorer oe;\r
- \r
- private Button applyAnimationButton;\r
- \r
- Resource selectedType;\r
- Resource sampleInstance;\r
- java.util.List<Resource> sampleSource;\r
- java.util.List<java.util.List<Resource>> samplePath;\r
-\r
- \r
- public ConfigureMonitorDialog(Shell parentShell, Session session, java.util.List<Resource> nodes) {\r
- super(parentShell);\r
- this.nodes = nodes;\r
- this.session = session;\r
- int shellStyle = getShellStyle();\r
- setShellStyle(shellStyle | SWT.MAX | SWT.RESIZE);\r
- }\r
- \r
- @Override\r
- protected void configureShell(Shell newShell) { \r
- super.configureShell(newShell);\r
- newShell.setText("Configure monitors");\r
- \r
- }\r
- \r
- protected Control createDialogArea(Composite parent) {\r
- Composite composite = (Composite) super.createDialogArea(parent);\r
- GridLayout layout = new GridLayout(2,true);\r
- layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);\r
- layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);\r
- layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);\r
- layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);\r
- composite.setLayout(layout);\r
- \r
- Label label = new Label(composite, SWT.WRAP);\r
- label.setText("Types");\r
- GridData data = new GridData(GridData.CENTER,GridData.FILL,true,false,1,1);\r
- data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);\r
- label.setLayoutData(data);\r
- label.setFont(parent.getFont());\r
- \r
- oeLabelComposite = new Composite(composite,SWT.NONE);\r
- oeLabelComposite.setLayoutData(data);\r
- oeLabelComposite.setLayout(new FillLayout(SWT.HORIZONTAL));\r
- //label = new Label(composite, SWT.WRAP);\r
- label = new Label(oeLabelComposite, SWT.WRAP);\r
- label.setText("Monitor source");\r
-// label.setLayoutData(data);\r
- label.setFont(parent.getFont());\r
- \r
- typeList = new List(composite, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY | SWT.V_SCROLL);\r
- typeList.setLayoutData(new GridData(GridData.GRAB_VERTICAL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));\r
- \r
- oeComposite = new Composite(composite,SWT.BORDER);\r
- oeComposite.setLayoutData(new GridData(GridData.GRAB_VERTICAL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));\r
- layout = new GridLayout();\r
- layout.marginWidth = 0;\r
- layout.marginHeight = 0;\r
- oeComposite.setLayout(layout);\r
- session.asyncRead(new GraphRequestAdapter() {\r
- TreeMap<String, Resource> sorter;\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- Collection<Resource> types = getTypes(g,nodes);\r
- \r
- sorter = new TreeMap<String, Resource>();\r
- for (Resource type : types) {\r
- IEntity t = EntityFactory.create(g, type);\r
- String key = t.getName();\r
- if (key.equals("")) key = "ERROR (" + type.getResourceId() + ")";\r
- sorter.put(key, type);\r
- }\r
- \r
- \r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- @Override\r
- public void requestCompleted(GraphRequestStatus status) {\r
- getShell().getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- for (Entry<String, Resource> e : sorter.entrySet()) { \r
- typeList.add(e.getKey());\r
- typeList.setData(e.getKey(), e.getValue());\r
- }\r
- }\r
- });\r
- }\r
- });\r
- \r
- typeList.addSelectionListener(new SelectionListener() {\r
- public void widgetSelected(SelectionEvent e) {\r
- session.asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- String key = typeList.getItem(typeList.getSelectionIndex());\r
- selectType(EntityFactory.create(g,(Resource) typeList.getData(key)));\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- }\r
- public void widgetDefaultSelected(SelectionEvent e) {\r
- }\r
- });\r
- \r
- \r
- \r
- Composite buttonComposite = new Composite(composite,SWT.NONE);\r
- buttonComposite.setLayoutData(new GridData(GridData.END,GridData.FILL,true,false,4,1));\r
- buttonComposite.setLayout(new FillLayout(SWT.HORIZONTAL));\r
- \r
- \r
- applyAnimationButton = new Button(buttonComposite,SWT.PUSH);\r
- applyAnimationButton.setText("Apply monitor configuration");\r
- applyAnimationButton.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- applyAnimation();\r
- }\r
- });\r
- return composite;\r
- }\r
- \r
- /**\r
- * Updates type selection:\r
- * Finds all GraphicsModels that are connected to instances of selected type with HasGraphics-relation\r
- * and lists them in modelList.\r
- *\r
- * @param resource\r
- */\r
- private void selectType(IEntity resource) {\r
- selectedType = resource.getResource();\r
- \r
- TreeMap<String, G3DModel> sorter = new TreeMap<String, G3DModel>();\r
- \r
- Collection<IEntity> models = resource.getRelatedObjects(ProcessResource.plant3Dresource.HasGraphics);\r
- for (IEntity model : models) {\r
- \r
- String key = model.getName();\r
- if (key.equals("")) key = "ERROR (" + model.getResource().getResourceId() + ")";\r
- sorter.put(key, new G3DModel(model));\r
- }\r
- \r
- if (oe != null) {\r
- oe.dispose(); \r
- }\r
- sampleInstance = null;\r
- sampleSource = null;\r
- for (Resource n : nodes) {\r
- IEntity t = EntityFactory.create(resource.getGraph(),n);\r
- if (t.isInstanceOf(resource.getResource())) {\r
- sampleInstance = n;\r
- break;\r
- }\r
- }\r
- if (sampleInstance != null) {\r
-// oe = new OntologyExplorer("Animation Source",this.getShell(), new OntologyEditorInput(sampleInstance.getId()));\r
-// if(viewpointControl != null && !viewpointControl.isDisposed()) {\r
-// viewpointControl.dispose();\r
-// }\r
-// viewpointControl = oe.getControl(oeLabelComposite, 1, OntologyExplorer.ViewpointSelector, SWT.NONE);\r
-// Control c = oe.getControl(oeComposite, 1, OntologyExplorer.OntologyTree, SWT.MULTI);\r
-// c.setLayoutData(new GridData(GridData.FILL_BOTH));\r
-// oe.init(null, ViewpointUtils.getModelledHandler(oe.getGraph(), Builtins.DefaultViewpointId), null, ViewLabelProviderDecorationSettings.DEFAULT, new MenuAboutToShowAction(), new NullAdditionAction(), false);\r
-// oe.setSelectionScheme(new SourceSelectionScheme(oe));\r
-// oeComposite.getParent().layout(true,true);\r
- oe = new GraphExplorer(oeComposite,SWT.MULTI);\r
- oe.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));\r
- oe.getViewer().addPostSelectionChangedListener(new OEPathSelectionListener(){\r
- @Override\r
- protected void pathSelectionUpdated(java.util.List<TraversalPath> paths) {\r
- if (paths.size() == 0) {\r
- //selectSource(null);\r
- } else {\r
- final java.util.List<TraversalPath> ps = paths;\r
- session.asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- selectSource(g,ps);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- }\r
- \r
- }\r
- });\r
- }\r
- \r
- }\r
- \r
- \r
- \r
- private void selectSource(Graph graph, java.util.List<TraversalPath> resources) {\r
- if (resources == null) {\r
- sampleSource = null;\r
- }\r
- for (TraversalPath p : resources) {\r
- IEntity t = EntityFactory.create(graph, p.getResource());\r
- if (!t.isInstanceOf(ProcessResource.builtins.Double)) {\r
- sampleSource = null;\r
- return;\r
- }\r
- }\r
- sampleSource = new ArrayList<Resource>();\r
- for (TraversalPath p : resources)\r
- sampleSource.add(p.getResource());\r
- \r
- samplePath = new ArrayList<java.util.List<Resource>>();\r
- for (int i = 0; i < sampleSource.size(); i++) {\r
- TraversalPath tpath = resources.get(i);\r
- java.util.List<Resource> path = new ArrayList<Resource>();\r
- PathUtils.createPath(path, tpath,sampleInstance,sampleSource.get(i),oe);\r
- samplePath.add(path);\r
- } \r
- \r
- }\r
- \r
- private void applyAnimation() {\r
- \r
- if (sampleInstance == null || sampleSource == null || samplePath == null ) {\r
- throw new RuntimeException("Missing required selections");\r
- //return;\r
- }\r
-\r
- PathContainer.getInstance().clearPaths(selectedType);\r
- for (java.util.List<Resource> s : samplePath) {\r
- PathContainer.getInstance().addPath(selectedType, s);\r
- }\r
- }\r
- \r
-\r
- \r
-\r
-\r
- private Collection<Resource> getTypes(Graph g, java.util.List<Resource> instances) {\r
- Set<Resource> types = new HashSet<Resource>();\r
- for (Resource r : instances) {\r
- IEntity t = EntityFactory.create(g,r);\r
- Collection<IEntity> tTypes = t.getTypes();\r
- for (IEntity type : tTypes)\r
- types.add(type.getResource());\r
- }\r
- return types;\r
- }\r
- \r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.dialogs;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import org.eclipse.jface.dialogs.Dialog;\r
-import org.eclipse.jface.dialogs.IDialogConstants;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.SelectionAdapter;\r
-import org.eclipse.swt.events.SelectionEvent;\r
-import org.eclipse.swt.layout.FillLayout;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.layout.GridLayout;\r
-import org.eclipse.swt.widgets.Button;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.eclipse.swt.widgets.Text;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.viewpoints.TraversalPath;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.animations.ResourcePipeAnimationController;\r
-import org.simantics.processeditor.common.PathUtils;\r
-import org.simantics.processeditor.stubs.PipeRun;\r
-import org.simantics.proconf.browsing.GraphExplorer;\r
-import org.simantics.proconf.g3d.animation.AnimationSystem;\r
-import org.simantics.proconf.g3d.base.JmeRenderingComponent;\r
-import org.simantics.proconf.g3d.tools.OEPathSelectionListener;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-\r
-\r
-public class ConfigurePipelineAnimationDialog extends Dialog {\r
- Session session;\r
- java.util.List<Resource> nodes;\r
- \r
- //private Control viewpointControl1;\r
- private GraphExplorer oe1;\r
- \r
- \r
- //private Control viewpointControl2;\r
- private GraphExplorer oe2;\r
- \r
- JmeRenderingComponent component;\r
- \r
- private Button applyAnimationButton;\r
- \r
- Resource sampleInstance;\r
- Resource sampleSource1;\r
- Resource sampleSource2;\r
- java.util.List<Resource> samplePath1;\r
- java.util.List<Resource> samplePath2;\r
- AnimationSystem animationSystem;\r
- \r
- Button scaleButton1;\r
- Text minText1;\r
- Text maxText1;\r
- \r
- Button scaleButton2;\r
- Text minText2;\r
- Text maxText2;\r
- \r
- public ConfigurePipelineAnimationDialog(Shell parentShell, Session session,java.util.List<Resource> nodes, JmeRenderingComponent component, AnimationSystem animationSystem) {\r
- super(parentShell);\r
- this.session = session;\r
- this.nodes = nodes;\r
- this.component = component;\r
- this.animationSystem = animationSystem;\r
- int shellStyle = getShellStyle();\r
- setShellStyle(shellStyle | SWT.MAX | SWT.RESIZE);\r
- }\r
- \r
- @Override\r
- protected void configureShell(Shell newShell) { \r
- super.configureShell(newShell);\r
- newShell.setText("Configure pipeline animations");\r
- \r
- }\r
- \r
- protected Control createDialogArea(Composite parent) {\r
- Composite composite = (Composite) super.createDialogArea(parent);\r
- GridLayout layout = new GridLayout(2,true);\r
- layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);\r
- layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);\r
- layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);\r
- layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);\r
- composite.setLayout(layout);\r
- \r
- Label label = new Label(composite, SWT.WRAP);\r
- label.setText("Color Change");\r
- GridData data = new GridData(GridData.CENTER,GridData.FILL,true,false,1,1);\r
- data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);\r
- label.setLayoutData(data);\r
- label.setFont(parent.getFont());\r
- \r
- label = new Label(composite, SWT.WRAP);\r
- label.setText("Particle velocity");\r
- label.setLayoutData(data);\r
- label.setFont(parent.getFont());\r
- \r
- sampleInstance = nodes.get(0).getResource();\r
- \r
-// oe1 = new OntologyExplorer("Animation Source",this.getShell(), new OntologyEditorInput(sampleInstance.getId()));\r
-// viewpointControl1 = oe1.getControl(composite, 1, OntologyExplorer.ViewpointSelector, SWT.NONE);\r
-// \r
-// oe2 = new OntologyExplorer("Animation Source",this.getShell(), new OntologyEditorInput(sampleInstance.getId()));\r
-// viewpointControl2 = oe2.getControl(composite, 1, OntologyExplorer.ViewpointSelector, SWT.NONE);\r
-// \r
-// Control c = oe1.getControl(composite, 1, OntologyExplorer.OntologyTree, SWT.SINGLE|SWT.BORDER);\r
-// c.setLayoutData(new GridData(GridData.FILL_BOTH));\r
-// \r
-// c = oe2.getControl(composite, 1, OntologyExplorer.OntologyTree, SWT.SINGLE|SWT.BORDER);\r
-// c.setLayoutData(new GridData(GridData.FILL_BOTH));\r
-// \r
-// oe1.init(null, ViewpointUtils.getModelledHandler(oe1.getGraph(), Builtins.DefaultViewpointId), null, ViewLabelProviderDecorationSettings.DEFAULT, new MenuAboutToShowAction(), new NullAdditionAction(), false);\r
-// oe1.setSelectionScheme(new SourceSelectionScheme(oe1));\r
-// \r
-// oe2.init(null, ViewpointUtils.getModelledHandler(oe1.getGraph(), Builtins.DefaultViewpointId), null, ViewLabelProviderDecorationSettings.DEFAULT, new MenuAboutToShowAction(), new NullAdditionAction(), false);\r
-// oe2.setSelectionScheme(new SourceSelectionScheme(oe2));\r
- \r
- oe1 = new GraphExplorer(composite,SWT.SINGLE);\r
- oe1.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));\r
- \r
- oe2 = new GraphExplorer(composite,SWT.SINGLE);\r
- oe2.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));\r
- \r
- oe1.getViewer().addPostSelectionChangedListener(new OEPathListener(oe1));\r
- oe2.getViewer().addPostSelectionChangedListener(new OEPathListener(oe2));\r
- \r
- \r
- Composite buttonComposite = new Composite(composite,SWT.NONE);\r
- buttonComposite.setLayoutData(new GridData(GridData.END,GridData.FILL,true,false,1,1));\r
- buttonComposite.setLayout(new FillLayout(SWT.HORIZONTAL));\r
- \r
- scaleButton1 = new Button(buttonComposite,SWT.CHECK);\r
- scaleButton1.setText("Scaling");\r
- scaleButton1.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- if (scaleButton1.getSelection()) {\r
- minText1.setEnabled(true);\r
- maxText1.setEnabled(true);\r
- } else {\r
- minText1.setEnabled(false);\r
- maxText1.setEnabled(false);\r
- }\r
- }\r
- });\r
- minText1 = new Text(buttonComposite,SWT.SINGLE|SWT.BORDER);\r
- minText1.setText("0.0");\r
- \r
- maxText1 = new Text(buttonComposite,SWT.SINGLE|SWT.BORDER);\r
- maxText1.setText("1.0");\r
- \r
- minText1.setEnabled(false);\r
- maxText1.setEnabled(false);\r
- \r
- buttonComposite = new Composite(composite,SWT.NONE);\r
- buttonComposite.setLayoutData(new GridData(GridData.END,GridData.FILL,true,false,1,1));\r
- buttonComposite.setLayout(new FillLayout(SWT.HORIZONTAL));\r
- \r
- scaleButton2 = new Button(buttonComposite,SWT.CHECK);\r
- scaleButton2.setText("Scaling");\r
- scaleButton2.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- if (scaleButton2.getSelection()) {\r
- minText2.setEnabled(true);\r
- maxText2.setEnabled(true);\r
- } else {\r
- minText2.setEnabled(false);\r
- maxText2.setEnabled(false);\r
- }\r
- }\r
- });\r
- minText2 = new Text(buttonComposite,SWT.SINGLE|SWT.BORDER);\r
- minText2.setText("0.0");\r
- \r
- maxText2 = new Text(buttonComposite,SWT.SINGLE|SWT.BORDER);\r
- maxText2.setText("1.0");\r
- \r
- minText2.setEnabled(false);\r
- maxText2.setEnabled(false);\r
- \r
- \r
- applyAnimationButton = new Button(composite,SWT.PUSH);\r
- applyAnimationButton.setText("Apply animation");\r
- applyAnimationButton.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- session.syncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- applyAnimation(g);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- }\r
- });\r
- applyAnimationButton.setLayoutData(new GridData(GridData.END,GridData.FILL,true,false,2,1));\r
- return composite;\r
- }\r
- \r
- private class OEPathListener extends OEPathSelectionListener {\r
- GraphExplorer oe;\r
- \r
- public OEPathListener(GraphExplorer oe) {\r
- this.oe = oe;\r
- }\r
-\r
- protected void pathSelectionUpdated(List<TraversalPath> paths) {\r
- if (paths.size() == 0) {\r
- //selectSource(null);\r
- } else {\r
- selectSource(oe,paths.get(0));\r
- }\r
- }\r
- }\r
- \r
- private void selectSource(GraphExplorer oe,TraversalPath path) {\r
- Graph graph = null;\r
- IEntity t = EntityFactory.create(graph,path.getResource());\r
- if (!t.isInstanceOf(ProcessResource.builtins.Double)) \r
- return;\r
- if (oe == oe1) {\r
- sampleSource1 = path.getResource();\r
- samplePath1 = new ArrayList<Resource>();\r
- PathUtils.createPath(samplePath1, path,sampleInstance,sampleSource1,oe);\r
- } else if (oe == oe2) {\r
- sampleSource2 = path.getResource();\r
- samplePath2 = new ArrayList<Resource>();\r
- PathUtils.createPath(samplePath2, path,sampleInstance,sampleSource2,oe);\r
- }\r
- }\r
- \r
- \r
- \r
- \r
- private void applyAnimation(Graph graph) {\r
- if (sampleInstance == null || sampleSource1 == null || sampleSource2 == null || samplePath1 == null|| samplePath2 == null) {\r
- throw new RuntimeException("Missing required selections");\r
- //return;\r
- }\r
- java.util.List<Resource> instances1 = new ArrayList<Resource>();\r
- java.util.List<Resource> instances2 = new ArrayList<Resource>();\r
- java.util.List<Resource> sources1 = new ArrayList<Resource>();\r
- java.util.List<Resource> sources2 = new ArrayList<Resource>();\r
- browseOthers(instances1, sources1,samplePath1);\r
- browseOthers(instances2, sources2,samplePath2);\r
- instances1.add(sampleInstance);\r
- instances2.add(sampleInstance); // instances1 == instances2\r
- sources1.add(sampleSource1);\r
- sources2.add(sampleSource2);\r
- \r
- for (int i = 0; i < instances1.size(); i++) {\r
- \r
- double cMin = 0.0;\r
- double cMax = 1.0;\r
- double vMin = 0.0;\r
- double vMax = 0.0;\r
- \r
- if (scaleButton1.getSelection()) {\r
- cMin = Double.parseDouble(minText1.getText());\r
- cMax = Double.parseDouble(maxText1.getText());\r
- }\r
- if (scaleButton2.getSelection()) {\r
- vMin = Double.parseDouble(minText2.getText());\r
- vMax = Double.parseDouble(maxText2.getText());\r
- }\r
- ResourcePipeAnimationController c = new ResourcePipeAnimationController(component, new PipeRun(graph,instances1.get(i)),sources1.get(i),cMin,cMax,sources2.get(i),vMin,vMax);\r
- \r
- animationSystem.add(c);\r
- }\r
- \r
- }\r
- \r
- private void browseOthers(java.util.List<Resource> instances,java.util.List<Resource> sources,java.util.List<Resource> samplePath) {\r
- Graph graph = null;\r
- java.util.List<Resource> possibleInstances = new ArrayList<Resource>();\r
- for (Resource n : nodes) {\r
- possibleInstances.add(n);\r
- }\r
- \r
- for (Resource instance : possibleInstances) {\r
- IEntity source = PathUtils.findSimilar(samplePath,EntityFactory.create(graph,instance));\r
- if (source != null) {\r
- instances.add(instance);\r
- sources.add(source.getResource());\r
- } else {\r
- ErrorLogger.getDefault().logWarning("Cannot find animation source for " + instance, null);\r
- }\r
- }\r
- }\r
- \r
- \r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.dialogs;\r
-\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.simantics.db.Session;\r
-import org.simantics.processeditor.ProcessResource;\r
-\r
-\r
-\r
-public class EquipmentDialog extends LibraryComponentDialog {\r
-\r
-\r
- public EquipmentDialog(Shell parentShell, String dialogTitle, Session session) {\r
- super(parentShell,session,ProcessResource.plant3Dresource.Equipment,dialogTitle);\r
- \r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.dialogs;\r
-\r
-import org.eclipse.jface.dialogs.Dialog;\r
-import org.eclipse.jface.dialogs.IDialogConstants;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.KeyEvent;\r
-import org.eclipse.swt.events.KeyListener;\r
-import org.eclipse.swt.events.SelectionEvent;\r
-import org.eclipse.swt.events.SelectionListener;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.widgets.Button;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.eclipse.swt.widgets.Text;\r
-\r
-public class FloorConfigureDialog extends Dialog implements KeyListener,SelectionListener {\r
- \r
- private boolean floorEnabled = true;\r
- private double floorHeight = 0.0;\r
- \r
- private Text floorHeightText = null;\r
- private Button floorEnabledButton = null;\r
- \r
- public FloorConfigureDialog(Shell shell) {\r
- super(shell);\r
- }\r
- \r
- @Override\r
- protected Control createDialogArea(Composite parent) {\r
- Composite composite = (Composite) super.createDialogArea(parent);\r
- Label label = new Label(composite, SWT.WRAP);\r
- label.setText("Configure floor");\r
- GridData data = new GridData(GridData.GRAB_HORIZONTAL\r
- | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL\r
- | GridData.VERTICAL_ALIGN_CENTER);\r
- \r
- data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);\r
- label.setLayoutData(data);\r
- label.setFont(parent.getFont());\r
- floorEnabledButton = new Button(composite,SWT.CHECK);\r
- floorEnabledButton.setText("Enabled");\r
- label = new Label(composite, SWT.WRAP);\r
- label.setText("Height");\r
- label.setLayoutData(data);\r
- label.setFont(parent.getFont());\r
- floorHeightText = new Text(composite,SWT.NONE);\r
- \r
- \r
- floorHeightText.addKeyListener(this);\r
- floorEnabledButton.addSelectionListener(this);\r
- floorEnabledButton.setSelection(floorEnabled);\r
- floorHeightText.setText(Double.toString(floorHeight));\r
- \r
- return composite;\r
- }\r
- \r
- @Override\r
- protected void configureShell(Shell newShell) {\r
- super.configureShell(newShell);\r
- newShell.setText("Configure floor");\r
- }\r
- \r
- public void keyPressed(KeyEvent e) {\r
- \r
- }\r
- \r
- public void keyReleased(KeyEvent e) {\r
- boolean ok = true;\r
- try {\r
- floorHeight = Double.parseDouble(floorHeightText.getText()); \r
- } catch (NumberFormatException err) {\r
- ok = false;\r
- }\r
- if (ok) {\r
- this.getButton(IDialogConstants.OK_ID).setEnabled(true);\r
- } else {\r
- this.getButton(IDialogConstants.OK_ID).setEnabled(false);\r
- }\r
- }\r
- \r
- public void widgetDefaultSelected(SelectionEvent e) {\r
- \r
- }\r
- \r
- public void widgetSelected(SelectionEvent e) {\r
- floorEnabled = floorEnabledButton.getSelection();\r
- }\r
-\r
- public boolean isFloorEnabled() {\r
- return floorEnabled;\r
- }\r
-\r
- public double getFloorHeight() {\r
- return floorHeight;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.dialogs;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.Stack;\r
-\r
-import org.eclipse.jface.dialogs.Dialog;\r
-import org.eclipse.jface.dialogs.IDialogConstants;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.SelectionEvent;\r
-import org.eclipse.swt.events.SelectionListener;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.List;\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.proconf.ui.ProConfUI;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-\r
-public class LibraryComponentDialog extends Dialog{ \r
- \r
- private List typeList;\r
- private Resource selectedType = null;\r
- private Session session;\r
- private String title;\r
- \r
- private Resource primaryType;\r
- private Collection<Resource> requiredTypes = new ArrayList<Resource>();\r
- private Collection<Resource> filteredTypes = new ArrayList<Resource>();\r
- \r
- public LibraryComponentDialog(Shell shell, Session session, Resource primaryType, String title) {\r
- super(shell);\r
- assert(title != null);\r
- this.session = session;\r
- this.title = title;\r
- this.primaryType = primaryType;\r
- }\r
- \r
- \r
- protected void setFilter(Collection<Resource> filter) {\r
- this.filteredTypes = filter;\r
- }\r
- \r
- protected void setRequired(Collection<Resource> required) {\r
- this.requiredTypes = required;\r
- }\r
- \r
- \r
- @Override\r
- protected void configureShell(Shell newShell) {\r
- \r
- super.configureShell(newShell);\r
- newShell.setText(title);\r
- }\r
-\r
- public Resource getComboValue() {\r
- return selectedType;\r
- }\r
- \r
- protected Control createDialogArea(Composite parent) {\r
- Composite composite = (Composite) super.createDialogArea(parent);\r
- \r
- Label label = new Label(composite, SWT.WRAP);\r
- label.setText("Select Component");\r
- GridData data = new GridData(GridData.GRAB_HORIZONTAL\r
- | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL\r
- | GridData.VERTICAL_ALIGN_CENTER);\r
- data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);\r
- label.setLayoutData(data);\r
- label.setFont(parent.getFont());\r
- // TODO : list populating is done in random order; change to alphabetic\r
- typeList = new List(composite, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY | SWT.V_SCROLL);\r
- typeList.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));\r
- \r
- typeList.addSelectionListener(new SelectionListener() {\r
- public void widgetSelected(SelectionEvent e) {\r
- String key = typeList.getItem(typeList.getSelectionIndex());\r
- selectedType = (Resource) typeList.getData(key);\r
- }\r
- public void widgetDefaultSelected(SelectionEvent e) {\r
- }\r
- });\r
- getShell().setText(title + " loading...");\r
- session.asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- loadComponents(g);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- @Override\r
- public void requestCompleted(GraphRequestStatus status) {\r
- getDialogArea().getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- getShell().setText(title);\r
- if (selectedType == null) {\r
- if (typeList.getItemCount() > 0) {\r
- typeList.select(0);\r
- selectedType = (Resource)typeList.getData(typeList.getItem(0));\r
- }\r
- }\r
- }\r
- \r
- });\r
- }\r
- });\r
-\r
- GridData data2 = new GridData(GridData.GRAB_HORIZONTAL\r
- | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL\r
- | GridData.VERTICAL_ALIGN_FILL);\r
- data2.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);\r
- data2.heightHint = 200;\r
- typeList.setLayoutData(data2);\r
- typeList.setFont(parent.getFont());\r
- \r
- typeList.showSelection();\r
- \r
- applyDialogFont(composite);\r
- return composite;\r
- }\r
- \r
- private void loadComponents(Graph g) {\r
- Resource projectResource = ProConfUI.getProject().getResource();\r
- Stack<Resource> handling = new Stack<Resource>();\r
- handling.push(projectResource);\r
- \r
- // this is just a hack to get equipment defined in ontologies\r
- Resource projectsLib = g.getObjects(projectResource, g.getBuiltins().PartOf).iterator().next();\r
- Collection<Resource> projects = g.getObjects(projectsLib, g.getBuiltins().ConsistsOf);\r
- Resource typeSystemProject = null;\r
- for (Resource project : projects) {\r
- IEntity ent = EntityFactory.create(g,project);\r
- String name = ent.getName();\r
- if(name.equals("Type System Project")) {\r
- typeSystemProject = project;\r
- break;\r
- }\r
- }\r
- Collection<Resource> ontologies = g.getObjects(typeSystemProject, g.getBuiltins().ConsistsOf);\r
- for (Resource ontology : ontologies) {\r
- if(g.isInstanceOf(ontology, g.getBuiltins().Ontology))\r
- handling.add(ontology);\r
- }\r
- \r
- while (!handling.isEmpty()) {\r
- final Resource node = handling.pop();\r
- if (g.isInstanceOf(node,primaryType)) {\r
- IEntity equipment = EntityFactory.create(g, node);\r
- Collection<IEntity> graphics = equipment\r
- .getRelatedObjects(ProcessResource.plant3Dresource.HasGraphics);\r
- if (graphics.size() != 1) {\r
- ErrorLogger.defaultLogError("Equipment "\r
- + equipment.getName() + " has " + graphics.size()\r
- + " + graphical representation!", null);\r
- } else {\r
- boolean add = true;\r
- for (Resource r : requiredTypes) {\r
- if (!equipment.isInstanceOf(r)) {\r
- add = false;\r
- break;\r
- }\r
- }\r
- if (add) {\r
- for (Resource r : filteredTypes) {\r
- if (equipment.isInstanceOf(r)) {\r
- add = false;\r
- break;\r
- }\r
- }\r
- }\r
- if (add) {\r
- final String name = equipment.getName();\r
- getDialogArea().getDisplay().asyncExec(new Runnable() {\r
- public void run() {\r
- // List won't work with two ore more same names.\r
- if (typeList.getData(name)!= null) {\r
- String n = new String(name);\r
- int i = 1;\r
- while (true) {\r
- n = name +"("+i+")";\r
- if (typeList.getData(n)== null) {\r
- typeList.add(n);\r
- typeList.setData(n, node);\r
- break;\r
- }\r
- }\r
- } else {\r
- typeList.add(name);\r
- typeList.setData(name, node);\r
- }\r
- }\r
- });\r
- }\r
- }\r
- } else {\r
- handling.addAll(g.getObjects(node,\r
- ProcessResource.builtins.ConsistsOf));\r
- }\r
-\r
- }\r
- \r
- }\r
- \r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.dialogs;\r
-\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.simantics.db.Session;\r
-import org.simantics.processeditor.ProcessResource;\r
-\r
-\r
-\r
-public class NozzleDialog extends LibraryComponentDialog {\r
-\r
-\r
- public NozzleDialog(Shell parentShell, String dialogTitle, Session session) {\r
- super(parentShell,session,ProcessResource.plant3Dresource.Nozzle,dialogTitle);\r
- \r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.dialogs;\r
-\r
-import java.util.Collection;\r
-\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
-import org.simantics.processeditor.ProcessResource;\r
-\r
-\r
-\r
-\r
-public class PipelineComponentDialog extends LibraryComponentDialog{\r
-\r
- \r
- public PipelineComponentDialog(Shell parentShell, Collection<Resource> requiredTypes, Collection<Resource> filteredTypes, Session session) {\r
- super(parentShell,session,ProcessResource.plant3Dresource.PipelineComponent,"Select Component");\r
- if (requiredTypes != null)\r
- setRequired(requiredTypes);\r
- if (filteredTypes != null)\r
- setFilter(filteredTypes);\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.dialogs;\r
-\r
-import org.eclipse.jface.dialogs.Dialog;\r
-import org.eclipse.jface.dialogs.IDialogConstants;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.KeyEvent;\r
-import org.eclipse.swt.events.KeyListener;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.eclipse.swt.widgets.Text;\r
-\r
-public class PipelineDialog extends Dialog implements KeyListener{\r
- Text pipeRadiusText;\r
- Text turnRadiusText;\r
- \r
- double pipeDiameter = 0.0;\r
- double turnRadius = 0.0;\r
- \r
- public PipelineDialog(Shell parentShell) {\r
- super(parentShell);\r
- }\r
- \r
- public PipelineDialog(Shell parentShell, double pipeRadius, double turnRadius) {\r
- super(parentShell);\r
- this.pipeDiameter = pipeRadius;\r
- this.turnRadius = turnRadius;\r
- }\r
-\r
- \r
- @Override\r
- protected void configureShell(Shell newShell) {\r
- super.configureShell(newShell);\r
- newShell.setText("Configure new pipeline");\r
- }\r
- \r
- @Override\r
- protected Control createDialogArea(Composite parent) {\r
- Composite composite = (Composite) super.createDialogArea(parent);\r
- Label label = new Label(composite, SWT.WRAP);\r
- label.setText("Input pipeline specifications");\r
- GridData data = new GridData(GridData.GRAB_HORIZONTAL\r
- | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL\r
- | GridData.VERTICAL_ALIGN_CENTER);\r
- \r
- data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);\r
- label.setLayoutData(data);\r
- label.setFont(parent.getFont());\r
- label = new Label(composite, SWT.WRAP);\r
- label.setText("Pipe diameter");\r
- label.setLayoutData(data);\r
- label.setFont(parent.getFont());\r
- pipeRadiusText = new Text(composite,SWT.BORDER);\r
- pipeRadiusText.setLayoutData(data);\r
- label = new Label(composite, SWT.WRAP);\r
- label.setText("Pipe elbow/turn radius");\r
- label.setLayoutData(data);\r
- label.setFont(parent.getFont());\r
- turnRadiusText = new Text(composite,SWT.BORDER);\r
- turnRadiusText.setLayoutData(data);\r
- \r
- pipeRadiusText.addKeyListener(this);\r
- turnRadiusText.addKeyListener(this);\r
- if (pipeDiameter > 0.0 && turnRadius > 0.0) {\r
- pipeRadiusText.setText(Double.toString(pipeDiameter));\r
- turnRadiusText.setText(Double.toString(turnRadius));\r
- }\r
- \r
- \r
- return composite;\r
- }\r
- \r
- @Override\r
- public int open() {\r
- return super.open();\r
- }\r
- \r
- \r
- \r
- \r
- public void keyPressed(KeyEvent e) {\r
- \r
- \r
- }\r
- \r
- public void keyReleased(KeyEvent e) {\r
- boolean ok = true;\r
- try {\r
- pipeDiameter = Double.parseDouble(pipeRadiusText.getText());\r
- turnRadius = Double.parseDouble(turnRadiusText.getText());\r
- if (pipeDiameter <= 0.0)\r
- ok = false;\r
- if (turnRadius <= 0.0)\r
- ok = false;\r
- \r
- } catch (NumberFormatException err) {\r
- ok = false;\r
- }\r
- if (ok) {\r
- this.getButton(IDialogConstants.OK_ID).setEnabled(true);\r
- } else {\r
- this.getButton(IDialogConstants.OK_ID).setEnabled(false);\r
- }\r
- }\r
-\r
-\r
- public double getPipeDiameter() {\r
- return pipeDiameter;\r
- }\r
-\r
-\r
- public double getTurnRadius() {\r
- return turnRadius;\r
- }\r
-\r
-\r
- \r
- \r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.gizmo;\r
-\r
-import java.net.URL;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import javax.vecmath.Point3d;\r
-\r
-import org.eclipse.core.runtime.FileLocator;\r
-import org.eclipse.core.runtime.Path;\r
-import org.simantics.processeditor.Activator;\r
-import org.simantics.processeditor.actions.PositionType;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.base.VecmathJmeTools;\r
-import org.simantics.proconf.g3d.gizmo.Gizmo;\r
-import org.simantics.utils.datastructures.Pair;\r
-\r
-import com.jme.bounding.BoundingSphere;\r
-import com.jme.image.Image;\r
-import com.jme.image.Texture;\r
-import com.jme.math.Vector3f;\r
-import com.jme.renderer.Renderer;\r
-import com.jme.scene.BillboardNode;\r
-import com.jme.scene.Node;\r
-import com.jme.scene.shape.Quad;\r
-import com.jme.scene.state.AlphaState;\r
-import com.jme.scene.state.LightState;\r
-import com.jme.scene.state.TextureState;\r
-import com.jme.scene.state.ZBufferState;\r
-import com.jme.util.TextureManager;\r
-\r
-\r
-/**\r
- * Gizmo that allows user to selected insertion point of a component\r
- * TODO : for splits we want use line between component ends to\r
- * position the button, instead of its center point. \r
- * \r
- * @author Marko Luukkainen <Marko.Luukkainen@vtt.fi>\r
- *\r
- */\r
-public class PositionSelectionGizmo implements Gizmo {\r
-\r
- private static String PICK_PREFIX = "insert";\r
- private static String SPLIT_TEXTURE = "icons/middle.png";\r
- private static String END_TEXTURE = "icons/plus.png";\r
- private static String PORT_TEXTURE = END_TEXTURE;\r
-\r
- private ThreeDimensionalEditorBase parent;\r
- \r
- private boolean changed = false;\r
- private int selected = -1;\r
- private boolean useDistanceResize = true;\r
- \r
- private List<BillboardNode> nodes;\r
- private List<AlphaState> alphaStates;\r
- private Node rootNode;\r
- \r
- public PositionSelectionGizmo(ThreeDimensionalEditorBase parent, List<Pair<Point3d, PositionType>> positions) {\r
- this.parent = parent;\r
- rootNode = new Node();\r
- rootNode.setCullMode(Node.CULL_NEVER);\r
- rootNode.setRenderQueueMode(Renderer.QUEUE_TRANSPARENT);\r
- rootNode.setLightCombineMode(LightState.OFF);\r
- int i = 0;\r
- nodes = new ArrayList<BillboardNode>();\r
- alphaStates = new ArrayList<AlphaState>();\r
- // create a button (billboard) for each insertion position\r
-\r
- ZBufferState zs = parent.getRenderingComponent().getDisplaySystem().getRenderer().createZBufferState();\r
- zs.setFunction(ZBufferState.CF_ALWAYS);\r
- \r
- for (Pair<Point3d, PositionType> p : positions) {\r
- BillboardNode node = new BillboardNode("");\r
- nodes.add(node);\r
- Quad quad = new Quad(PICK_PREFIX + i,1.f,1.f);\r
- \r
- TextureState ts = parent.getRenderingComponent().getDisplaySystem().getRenderer().createTextureState();\r
- String filename = "";\r
- switch (p.second) {\r
- case NEXT:\r
- case PREVIOUS:\r
- filename = END_TEXTURE;\r
- break;\r
- case SPLIT:\r
- filename = SPLIT_TEXTURE;\r
- break;\r
- case PORT:\r
- filename = PORT_TEXTURE;\r
- }\r
- URL url = FileLocator.find(Activator.getDefault().getBundle(), new Path(filename),null);\r
- Image image = TextureManager.loadImage(url, true);\r
- Texture texture = new Texture();\r
- texture.setImage(image);\r
- texture.setFilter(Texture.FM_LINEAR);\r
- ts.setTexture(texture);\r
- quad.setRenderState(ts);\r
- \r
- AlphaState as = parent.getRenderingComponent().getDisplaySystem().getRenderer().createAlphaState();\r
- as.setSrcFunction(AlphaState.SB_SRC_ALPHA);\r
- as.setDstFunction(AlphaState.DB_ONE_MINUS_SRC_ALPHA);\r
- as.setBlendEnabled(true);\r
- alphaStates.add(as);\r
- quad.setRenderState(as);\r
- quad.setRenderState(zs);\r
- \r
- node.attachChild(quad);\r
- node.setLocalTranslation(VecmathJmeTools.get(p.first));\r
- quad.setModelBound(new BoundingSphere(0.5f,new Vector3f()));\r
- quad.updateModelBound();\r
- rootNode.attachChild(node);\r
- \r
- i++;\r
- }\r
- }\r
- \r
- \r
- @Override\r
- public Node getNode() {\r
- return rootNode;\r
- }\r
- \r
- @Override\r
- public String getPickPrefix() {\r
- return PICK_PREFIX;\r
- }\r
- \r
- @Override\r
- public boolean isChanged() {\r
- return changed;\r
- }\r
- \r
- @Override\r
- public void setChanged(boolean b) {\r
- changed = b;\r
- }\r
- \r
- @Override\r
- public void setSelected(String name) {\r
- if (name == null) {\r
- setSelected(-1);\r
- return;\r
- }\r
- assert(name.startsWith(PICK_PREFIX));\r
- setSelected(Integer.parseInt(name.substring(PICK_PREFIX.length())));\r
- }\r
- \r
- private void setSelected(int i) {\r
- if (selected == i)\r
- return;\r
- if (selected != -1) {\r
- alphaStates.get(selected).setDstFunction(AlphaState.DB_ONE_MINUS_SRC_ALPHA);\r
- nodes.get(selected).getChild(0).setRenderState(alphaStates.get(selected));\r
- }\r
- selected = i;\r
- if (selected != -1) {\r
- alphaStates.get(selected).setDstFunction(AlphaState.DB_ONE);\r
- nodes.get(selected).getChild(0).setRenderState(alphaStates.get(selected));\r
- }\r
- parent.setViewChanged(true);\r
- }\r
- \r
- public int getSelected() {\r
- return selected;\r
- }\r
- \r
- public void update() {\r
- if (useDistanceResize) {\r
- Vector3f v = VecmathJmeTools.get(parent.getCamera().getCameraPos());\r
- for (BillboardNode n : nodes) {\r
- float length = v.subtract(n.getWorldTranslation()).length();\r
- n.setLocalScale(length * 0.06f);\r
- }\r
- }\r
- }\r
-\r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.handlers;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.processeditor.Activator;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.proconf.ui.workbench.ResourceEditorInput;\r
-import org.simantics.proconf.ui.workbench.editor.SimpleEditorAdapter;\r
-import org.simantics.utils.ui.BundleUtils;\r
-import org.simantics.utils.ui.workbench.WorkbenchUtils;\r
-\r
-\r
-/**\r
- * EditorAdapter for EquipmentEditor\r
- * \r
- * @author Marko Luukkainen <Marko.Luukkainen@vtt.fi>\r
- *\r
- */\r
-public class EquipmentEditorAdapter extends SimpleEditorAdapter {\r
- public EquipmentEditorAdapter() {\r
- super("Equipment Editor",\r
- BundleUtils.getImageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/tank.png"),\r
- null,null,null);\r
- }\r
-\r
- @Override\r
- public boolean canHandle(Graph g, Resource r) {\r
- if(ProcessResource.plant3Dresource == null) return false; \r
- if(ProcessResource.plant3Dresource.Plant == null) return false; \r
- if(!g.isInstanceOf(r, ProcessResource.plant3Dresource.Equipment)) return false;\r
- return true;\r
- }\r
-\r
-\r
- @Override\r
- public void openEditor(Resource r) throws Exception {\r
- WorkbenchUtils.openEditor("org.simantics.proconf.processeditor.equipmenteditor", new ResourceEditorInput("org.simantics.proconf.processeditor.equipmenteditor",r));\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.handlers;\r
-\r
-import java.util.ArrayList;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import org.eclipse.core.commands.AbstractHandler;\r
-import org.eclipse.core.commands.ExecutionEvent;\r
-import org.eclipse.core.commands.ExecutionException;\r
-import org.eclipse.jface.dialogs.Dialog;\r
-import org.eclipse.jface.viewers.ISelection;\r
-import org.eclipse.jface.viewers.IStructuredSelection;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.ModifyEvent;\r
-import org.eclipse.swt.events.ModifyListener;\r
-import org.eclipse.swt.events.SelectionAdapter;\r
-import org.eclipse.swt.events.SelectionEvent;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.widgets.Button;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Display;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.eclipse.swt.widgets.Text;\r
-import org.eclipse.ui.handlers.HandlerUtil;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.stubs.Library;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.instantiation.InstanceFactory;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.proconf.ui.ProConfUI;\r
-import org.simantics.proconf.ui.utils.ResourceAdaptionUtils;\r
-\r
-\r
-\r
-/**\r
- * Handler that creates new pipeline components.\r
- * \r
- * @author Marko Luukkainen <Marko.Luukkainen@vtt.fi>\r
- *\r
- */\r
-public class NewComponentHandler extends AbstractHandler {\r
- \r
- private Map<Resource, String> nameMap;\r
- \r
- @Override\r
- public Object execute(ExecutionEvent event) throws ExecutionException {\r
- ISelection s = HandlerUtil.getCurrentSelectionChecked(event);\r
- IStructuredSelection ss = (IStructuredSelection) s;\r
- if (ss.size() != 1)\r
- return null;\r
- final Resource lib = ResourceAdaptionUtils.toSingleResource(ss);\r
- \r
- \r
- \r
- if (nameMap == null) {\r
- ProConfUI.getSession().syncRead(new GraphRequestAdapter(){\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- nameMap = new HashMap<Resource, String>();\r
- for (Resource r : getComponentTypes()) {\r
- IEntity e = EntityFactory.create(g,r);\r
- nameMap.put(r, e.getName());\r
- for (Resource r2 : getComponentOptions(r)) {\r
- IEntity e2 = EntityFactory.create(g,r2);\r
- nameMap.put(r2, e2.getName());\r
- }\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- }\r
- \r
- ComponentTypeDialog dialog = new ComponentTypeDialog(Display.getDefault().getActiveShell());\r
- if (dialog.open() == ComponentTypeDialog.CANCEL)\r
- return null;\r
- final List<Resource> types = dialog.getSelection();\r
- final String name = dialog.getName();\r
- \r
- if (types.size() == 0 || name == null || name.length() == 0)\r
- return null;\r
- \r
- ProConfUI.getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- // instantiate component\r
- IEntity instance = EntityFactory.create(g, InstanceFactory.instantiate(g, types));\r
- Library l = new Library(g, lib);\r
- l.addStatement(g.getBuiltins().ConsistsOf, instance);\r
- instance.setName(name);\r
- \r
- // TODO : is this correct (instance & inherits)\r
- for (Resource type : types) {\r
- instance.addStatement(ProcessResource.builtins.Inherits, type);\r
- }\r
- \r
- // instantiate control point(s)\r
- List<Resource> cpTypes = getControlPointTypes(types);\r
- boolean isDual = (cpTypes.contains(ProcessResource.plant3Dresource.SizeChangeControlPoint) || \r
- cpTypes.contains(ProcessResource.plant3Dresource.OffsettingPoint));\r
- IEntity cp = EntityFactory.create(g, InstanceFactory.instantiate(g, cpTypes));\r
- instance.addStatement(ProcessResource.plant3Dresource.HasControlPoint, cp);\r
- if (isDual) {\r
- IEntity subCP = EntityFactory.create(g, InstanceFactory.instantiate(g, ProcessResource.plant3Dresource.DualSubControlPoint));\r
- cp.addStatement(ProcessResource.plant3Dresource.HasSubPoint, subCP);\r
- }\r
- // instantiate model\r
- Resource modelType = g.getResourceByURI("http://www.vtt.fi/Simantics/CSG/1.0/Types#CSGModel");\r
- IEntity model = EntityFactory.create(g, InstanceFactory.instantiate(g, modelType));\r
- instance.addStatement(ProcessResource.plant3Dresource.HasGraphics, model);\r
- \r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- \r
- return null;\r
- }\r
- \r
- /**\r
- * Returns all possible types for a pipeline component\r
- * @return\r
- */\r
- private List<Resource> getComponentTypes() {\r
- List<Resource> list = new ArrayList<Resource>();\r
- list.add(ProcessResource.plant3Dresource.FixedLengthInlineComponent);\r
- list.add(ProcessResource.plant3Dresource.VariableLengthInlineComponent);\r
- list.add(ProcessResource.plant3Dresource.VariableAngleTurnComponent);\r
- list.add(ProcessResource.plant3Dresource.FixedAngleTurnComponent);\r
- list.add(ProcessResource.plant3Dresource.EndComponent);\r
- list.add(ProcessResource.plant3Dresource.Nozzle);\r
- \r
- return list;\r
- }\r
- \r
- /**\r
- * Returns optional types for a component type\r
- * @param type\r
- * @return\r
- */\r
- private List<Resource> getComponentOptions(Resource type) {\r
- List<Resource> list = new ArrayList<Resource>();\r
- if (type.equals(ProcessResource.plant3Dresource.FixedLengthInlineComponent)) {\r
- list.add(ProcessResource.plant3Dresource.SizeChangeComponent);\r
- list.add(ProcessResource.plant3Dresource.OffsetComponent);\r
- }\r
- return list;\r
- }\r
- \r
- /**\r
- * Returns control point type(s) for given control point type. \r
- * \r
- * @param types\r
- * @return\r
- */\r
- private List<Resource> getControlPointTypes(List<Resource> types) {\r
- Resource primaryType = types.get(0);\r
- List<Resource> cpTypes = new ArrayList<Resource>();\r
- if (primaryType == ProcessResource.plant3Dresource.FixedLengthInlineComponent) {\r
- if (types.size() == 1) {\r
- cpTypes.add(ProcessResource.plant3Dresource.FixedLengthControlPoint);\r
- } else {\r
- if (types.contains(ProcessResource.plant3Dresource.SizeChangeComponent)) {\r
- cpTypes.add(ProcessResource.plant3Dresource.SizeChangeControlPoint);\r
- }\r
- if (types.contains(ProcessResource.plant3Dresource.OffsetComponent)) {\r
- cpTypes.add(ProcessResource.plant3Dresource.OffsettingPoint);\r
- }\r
- if (cpTypes.size() == 0) {\r
- throw new RuntimeException("Cannot find control point type for " + primaryType);\r
- }\r
- }\r
- \r
- } else if (primaryType == ProcessResource.plant3Dresource.VariableLengthInlineComponent) {\r
- cpTypes.add(ProcessResource.plant3Dresource.VariableLengthControlPoint);\r
- } else if (primaryType == ProcessResource.plant3Dresource.FixedAngleTurnComponent) {\r
- cpTypes.add(ProcessResource.plant3Dresource.FixedAngleTurnControlPoint);\r
- } else if (primaryType == ProcessResource.plant3Dresource.VariableAngleTurnComponent) {\r
- cpTypes.add(ProcessResource.plant3Dresource.VariableAngleTurnControlPoint);\r
- } else if (primaryType == ProcessResource.plant3Dresource.EndComponent) {\r
- cpTypes.add(ProcessResource.plant3Dresource.EndComponentControlPoint);\r
- } else if (primaryType == ProcessResource.plant3Dresource.Nozzle) {\r
- cpTypes.add(ProcessResource.plant3Dresource.NozzleControlPoint);\r
- } else {\r
- throw new RuntimeException("Cannot find control point type for " + primaryType);\r
- }\r
- \r
- return cpTypes;\r
- }\r
- \r
- \r
- private class ComponentTypeDialog extends Dialog {\r
- \r
- List<Resource> selected = new ArrayList<Resource>();\r
- String name;\r
- \r
- public ComponentTypeDialog(Shell shell) {\r
- super(shell);\r
- }\r
- \r
- @Override\r
- protected Control createDialogArea(Composite parent) {\r
- Composite composite = (Composite) super.createDialogArea(parent);\r
- Label label = new Label(composite,SWT.NONE);\r
- label.setText("Name:");\r
- Text text = new Text(composite,SWT.SINGLE|SWT.BORDER);\r
- text.addModifyListener(new ModifyListener() {\r
- @Override\r
- public void modifyText(ModifyEvent e) {\r
- name = ((Text)e.widget).getText();\r
- }\r
- });\r
- GridData data = new GridData();\r
- data.grabExcessHorizontalSpace = true;\r
- data.horizontalAlignment = SWT.FILL;\r
- text.setLayoutData(data);\r
- label = new Label(composite,SWT.NONE);\r
- label.setText("Type:");\r
- for (Resource r : getComponentTypes()) {\r
- final Button b = new Button(composite,SWT.RADIO);\r
- b.setText(nameMap.get(r));\r
- b.setData(r);\r
- b.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- Button button = (Button)e.widget;\r
- Resource res = (Resource)button.getData();\r
- if (button.getSelection()) {\r
- selected.add(0,res);\r
- } else {\r
- selected.remove(res);\r
- }\r
- }\r
- });\r
- data = new GridData();\r
- b.setLayoutData(data);\r
- for (Resource r2 : getComponentOptions(r)) {\r
- final Button b2 = new Button(composite,SWT.CHECK);\r
- b2.setText(nameMap.get(r2));\r
- b2.setData(r2);\r
- b.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- b2.setEnabled(b.getSelection());\r
- Resource res = (Resource)b2.getData();\r
- if (!b.getSelection()) {\r
- selected.remove(res);\r
- } else if (b2.getSelection()) {\r
- selected.add(res);\r
- }\r
- }\r
- });\r
- b2.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- Button button = (Button)e.widget;\r
- Resource res = (Resource)button.getData();\r
- if (button.getSelection()) {\r
- selected.add(res);\r
- } else {\r
- selected.remove(res);\r
- }\r
- }\r
- });\r
- b2.setEnabled(false);\r
- data = new GridData();\r
- data.horizontalIndent = convertWidthInCharsToPixels(2);\r
- b2.setLayoutData(data);\r
- }\r
- }\r
- \r
- return composite;\r
- }\r
- \r
- List<Resource> getSelection() {\r
- return selected;\r
- }\r
- \r
- public String getName() {\r
- return name;\r
- }\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.handlers;\r
-\r
-import org.eclipse.core.commands.AbstractHandler;\r
-import org.eclipse.core.commands.ExecutionEvent;\r
-import org.eclipse.core.commands.ExecutionException;\r
-import org.eclipse.jface.dialogs.Dialog;\r
-import org.eclipse.jface.viewers.ISelection;\r
-import org.eclipse.jface.viewers.IStructuredSelection;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.ModifyEvent;\r
-import org.eclipse.swt.events.ModifyListener;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Display;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.eclipse.swt.widgets.Text;\r
-import org.eclipse.ui.handlers.HandlerUtil;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.stubs.Library;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.instantiation.InstanceFactory;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.stubs.Equipment;\r
-import org.simantics.proconf.ui.ProConfUI;\r
-import org.simantics.proconf.ui.utils.ResourceAdaptionUtils;\r
-\r
-\r
-/**\r
- * Creates new equipment\r
- * \r
- * @author Marko Luukkainen <Marko.Luukkainen@vtt.fi>\r
- *\r
- */\r
-public class NewEquipmentHandler extends AbstractHandler {\r
- \r
- @Override\r
- public Object execute(ExecutionEvent event) throws ExecutionException {\r
- ISelection s = HandlerUtil.getCurrentSelectionChecked(event);\r
- IStructuredSelection ss = (IStructuredSelection) s;\r
- if (ss.size() != 1)\r
- return null;\r
- final Resource lib = ResourceAdaptionUtils.toSingleResource(ss);\r
- \r
- EquipmentDialog dialog = new EquipmentDialog(Display.getDefault().getActiveShell());\r
- if (dialog.open() == EquipmentDialog.CANCEL)\r
- return null;\r
- final String name = dialog.getName();\r
- if (name == null || name.length() == 0)\r
- return null;\r
- ProConfUI.getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- Equipment equipment = Equipment.createDefault(g);\r
- Library l = new Library(g, lib);\r
- l.addStatement(g.getBuiltins().ConsistsOf, equipment);\r
- \r
- // TODO : is this correct (instance & inherits)\r
- equipment.addStatement(ProcessResource.builtins.Inherits, ProcessResource.plant3Dresource.Equipment);\r
-\r
- Resource modelType = g.getResourceByURI("http://www.vtt.fi/Simantics/CSG/1.0/Types#CSGModel");\r
- IEntity model = EntityFactory.create(g, InstanceFactory.instantiate(g, modelType));\r
- equipment.addStatement(ProcessResource.plant3Dresource.HasGraphics, model);\r
- equipment.setName(name);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- \r
- return null;\r
- }\r
- \r
- private class EquipmentDialog extends Dialog {\r
- \r
- private String name;\r
- \r
- public EquipmentDialog(Shell shell) {\r
- super(shell);\r
- }\r
- \r
- @Override\r
- protected Control createDialogArea(Composite parent) {\r
- Composite composite = (Composite) super.createDialogArea(parent);\r
- Label label = new Label(composite,SWT.NONE);\r
- label.setText("Name:");\r
- Text text = new Text(composite,SWT.SINGLE|SWT.BORDER);\r
- text.addModifyListener(new ModifyListener() {\r
- @Override\r
- public void modifyText(ModifyEvent e) {\r
- name = ((Text)e.widget).getText();\r
- }\r
- });\r
- GridData data = new GridData();\r
- data.grabExcessHorizontalSpace = true;\r
- data.horizontalAlignment = SWT.FILL;\r
- text.setLayoutData(data);\r
- return composite;\r
- }\r
- \r
- public String getName() {\r
- return name;\r
- }\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.handlers;\r
-\r
-import org.eclipse.core.commands.AbstractHandler;\r
-import org.eclipse.core.commands.ExecutionEvent;\r
-import org.eclipse.core.commands.ExecutionException;\r
-import org.eclipse.jface.dialogs.Dialog;\r
-import org.eclipse.jface.viewers.ISelection;\r
-import org.eclipse.jface.viewers.IStructuredSelection;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.ModifyEvent;\r
-import org.eclipse.swt.events.ModifyListener;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Control;\r
-import org.eclipse.swt.widgets.Display;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.Shell;\r
-import org.eclipse.swt.widgets.Text;\r
-import org.eclipse.ui.handlers.HandlerUtil;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.stubs.Library;\r
-import org.simantics.processeditor.stubs.Plant;\r
-import org.simantics.proconf.ui.ProConfUI;\r
-import org.simantics.proconf.ui.utils.ResourceAdaptionUtils;\r
-\r
-\r
-public class NewPlantHandler extends AbstractHandler {\r
- \r
- @Override\r
- public Object execute(ExecutionEvent event) throws ExecutionException {\r
- ISelection s = HandlerUtil.getCurrentSelectionChecked(event);\r
- IStructuredSelection ss = (IStructuredSelection) s;\r
- if (ss.size() != 1)\r
- return null;\r
- final Resource lib = ResourceAdaptionUtils.toSingleResource(ss);\r
- \r
- PlantDialog dialog = new PlantDialog(Display.getDefault().getActiveShell());\r
- if (dialog.open() == PlantDialog.CANCEL)\r
- return null;\r
- final String name = dialog.getName();\r
- if (name == null || name.length() == 0)\r
- return null;\r
- \r
- ProConfUI.getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- Plant model = Plant.createDefault(g);\r
- model.setName(name);\r
- Library l = new Library(g, lib);\r
- l.addStatement(g.getBuiltins().ConsistsOf, model);\r
- \r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- \r
- return null;\r
- }\r
- \r
- private class PlantDialog extends Dialog {\r
- \r
- private String name;\r
- \r
- public PlantDialog(Shell shell) {\r
- super(shell);\r
- }\r
- \r
- @Override\r
- protected Control createDialogArea(Composite parent) {\r
- Composite composite = (Composite) super.createDialogArea(parent);\r
- Label label = new Label(composite,SWT.NONE);\r
- label.setText("Name:");\r
- Text text = new Text(composite,SWT.SINGLE|SWT.BORDER);\r
- text.addModifyListener(new ModifyListener() {\r
- @Override\r
- public void modifyText(ModifyEvent e) {\r
- name = ((Text)e.widget).getText();\r
- }\r
- });\r
- GridData data = new GridData();\r
- data.grabExcessHorizontalSpace = true;\r
- data.horizontalAlignment = SWT.FILL;\r
- text.setLayoutData(data);\r
- return composite;\r
- }\r
- \r
- public String getName() {\r
- return name;\r
- }\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.handlers;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.processeditor.Activator;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.proconf.ui.workbench.ResourceEditorInput;\r
-import org.simantics.proconf.ui.workbench.editor.SimpleEditorAdapter;\r
-import org.simantics.utils.ui.BundleUtils;\r
-import org.simantics.utils.ui.workbench.WorkbenchUtils;\r
-\r
-\r
-/**\r
- * EditorAdapter for PipeLineComponentEditor\r
- * \r
- * @author Marko Luukkainen <Marko.Luukkainen@vtt.fi>\r
- *\r
- */\r
-public class PipelineComponentEditorAdapter extends SimpleEditorAdapter {\r
- public PipelineComponentEditorAdapter() {\r
- super("Component Editor",\r
- BundleUtils.getImageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/Component.png"),\r
- null,null,null);\r
- }\r
-\r
- @Override\r
- public boolean canHandle(Graph g, Resource r) {\r
- if(ProcessResource.plant3Dresource == null) return false; \r
- if(ProcessResource.plant3Dresource.Plant == null) return false; \r
- if(!g.isInstanceOf(r, ProcessResource.plant3Dresource.PipelineComponent)) {\r
- if (g.isInstanceOf(r, ProcessResource.plant3Dresource.Nozzle))\r
- return true;\r
- return false;\r
- }\r
- if(g.isInstanceOf(r, ProcessResource.plant3Dresource.CodedComponent)) return false;\r
- return true;\r
- }\r
-\r
-\r
- @Override\r
- public void openEditor(Resource r) throws Exception {\r
- WorkbenchUtils.openEditor("org.simantics.proconf.processeditor.componenteditor", new ResourceEditorInput("org.simantics.proconf.processeditor.componenteditor",r));\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.handlers;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.processeditor.Activator;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.proconf.ui.workbench.ResourceEditorInput;\r
-import org.simantics.proconf.ui.workbench.editor.SimpleEditorAdapter;\r
-import org.simantics.utils.ui.BundleUtils;\r
-import org.simantics.utils.ui.workbench.WorkbenchUtils;\r
-\r
-\r
-public class Plant3DEditorAdapter extends SimpleEditorAdapter {\r
- public Plant3DEditorAdapter() {\r
- super("PlantEditor",\r
- BundleUtils.getImageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/factory.png"),\r
- null,null,null);\r
- }\r
-\r
- @Override\r
- public boolean canHandle(Graph g, Resource r) {\r
- if(ProcessResource.plant3Dresource == null) return false; \r
- if(ProcessResource.plant3Dresource.Plant == null) return false; \r
- return g.isInstanceOf(r, ProcessResource.plant3Dresource.Plant);\r
- }\r
-\r
-\r
- @Override\r
- public void openEditor(Resource r) throws Exception {\r
- WorkbenchUtils.openEditor("org.simantics.proconf.processeditor.planteditor", new ResourceEditorInput("org.simantics.proconf.processeditor.planteditor",r));\r
-\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.handlers;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.adaption.AdaptionException;\r
-import org.simantics.db.adaption.ResourceAdapter;\r
-\r
-public class Plant3DProjectAdapter implements ResourceAdapter {\r
- @SuppressWarnings("unchecked")\r
- @Override\r
- public <T> T adapt(Graph graph, Resource resource, Resource mia) throws AdaptionException {\r
- return (T) new Plant3DProjectType(graph,resource);\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.handlers;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-\r
-import org.simantics.db.Builtins;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.direct.GraphUtils;\r
-import org.simantics.proconf.ui.projects.IProject;\r
-import org.simantics.proconf.ui.projects.ProjectType;\r
-\r
-public class Plant3DProjectType extends ProjectType{\r
-\r
- public Plant3DProjectType(Graph graph, Resource projectTypeResource) {\r
- super(graph, projectTypeResource);\r
- }\r
-\r
- @Override\r
- public Resource createProject(Graph g, String name) throws Exception {\r
- Resource project = super.createProject(g, name);\r
- Builtins b = g.getBuiltins();\r
- { // Plants\r
- Resource modelLibrary = g.newResource(); \r
- g.addStatement(modelLibrary, b.InstanceOf, b.ModelLibrary);\r
- GraphUtils.addRelatedScalarString(g, modelLibrary, b.HasName, "Plants");\r
- g.addStatement(project, b.ConsistsOf, modelLibrary); \r
- }\r
- { // Equipment\r
- Resource modelLibrary = g.newResource(); \r
- g.addStatement(modelLibrary, b.InstanceOf, b.ModelLibrary);\r
- GraphUtils.addRelatedScalarString(g, modelLibrary, b.HasName, "Equipment");\r
- g.addStatement(project, b.ConsistsOf, modelLibrary); \r
- }\r
- return project;\r
- \r
- }\r
- \r
- @Override\r
- public IProject loadProject(Graph g, Resource r) {\r
- \r
- IProject project = super.loadProject(g, r);\r
- project.set(DefaultPerspective, "org.simantics.proconf.processeditor.plantmodelling");\r
- Collection<String> perspectives = new ArrayList<String>();\r
- perspectives.add("org.simantics.proconf.processeditor.plantmodelling");\r
- project.set(Perspectives, perspectives);\r
- \r
- return project;\r
- }\r
- \r
-\r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.monitors;\r
-\r
-import java.awt.Color;\r
-import java.util.ArrayList;\r
-\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.stubs.InlineComponent;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.base.VecmathJmeTools;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-\r
-import com.jme.image.Texture;\r
-import com.jme.math.Vector3f;\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.renderer.Renderer;\r
-import com.jme.scene.BillboardNode;\r
-import com.jme.scene.Node;\r
-import com.jme.scene.shape.Quad;\r
-import com.jme.scene.state.AlphaState;\r
-import com.jme.scene.state.MaterialState;\r
-import com.jme.scene.state.RenderState;\r
-import com.jme.scene.state.TextureState;\r
-import com.jme.scene.state.ZBufferState;\r
-import com.jmex.awt.swingui.ImageGraphics;\r
-\r
-\r
-\r
-\r
-\r
-/**\r
- * A monitor that uses billboard to show it's information. \r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-//TODO : should it be variable length / fixed length inline component instead of Straight\r
-\r
-public class BillboardMonitor implements Monitor{\r
- private enum Type{POSITION,PIPE};\r
- private Type type;\r
- private ThreeDimensionalEditorBase editor; \r
- private BillboardNode monitorNode = null;\r
- private int monitorSize = 128;\r
- private ImageGraphics graphics = ImageGraphics.createInstance(monitorSize, monitorSize, 0);\r
- private Node currentParent = null;\r
- private IGraphicsNode node = null;\r
- private boolean useDistanceResize = true;\r
- \r
- Point3d start;\r
- Point3d end;\r
- Point3d middle;\r
- \r
- private MonitorTextProvider provider = new ObjectPropertyProvider();\r
- \r
- \r
- public BillboardMonitor(ThreeDimensionalEditorBase editor) {\r
- this.editor = editor;\r
- monitorNode = new BillboardNode("");\r
- monitorNode.setRenderQueueMode(Renderer.QUEUE_TRANSPARENT);\r
- ZBufferState zs = editor.getRenderingComponent()\r
- .getDisplaySystem().getRenderer().createZBufferState();\r
- zs.setEnabled(true);\r
- zs.setFunction(ZBufferState.CF_ALWAYS);\r
- monitorNode.setRenderState(zs);\r
- Quad quad = new Quad("");\r
- quad.initialize(3.f, 3.f);\r
- monitorNode.attachChild(quad);\r
- // SWTImageGraphics graphics =\r
- // SWTImageGraphics.createInstance(64,64, 0);\r
-\r
- graphics.clearRect(0, 0, monitorSize, monitorSize);\r
-\r
- // graphics.setFont(new Font("Arial",Font.PLAIN,30));\r
- // graphics.setColor(Display.getDefault().getSystemColor(SWT.COLOR_GREEN));\r
- graphics.setColor(new Color(0, 255, 0, 255));\r
- graphics.drawString("Monitor", 0, 32);\r
- \r
- TextureState ts = editor.getRenderingComponent().getDisplaySystem().getRenderer().createTextureState();\r
- Texture texture = new Texture();\r
- texture.setApply(Texture.AM_MODULATE);\r
- // texture.setBlendColor(new ColorRGBA(1, 1, 1, 1));\r
- texture.setFilter(Texture.MM_LINEAR);\r
- texture.setMipmapState(Texture.FM_LINEAR);\r
- texture.setImage(graphics.getImage());\r
- graphics.update();\r
- AlphaState as = editor.getRenderingComponent().getDisplaySystem()\r
- .getRenderer().createAlphaState();\r
- as.setBlendEnabled(true);\r
- as.setSrcFunction(AlphaState.SB_SRC_ALPHA);\r
- as.setDstFunction(AlphaState.DB_ONE_MINUS_SRC_ALPHA);\r
- as.setTestEnabled(true);\r
- as.setTestFunction(AlphaState.TF_GREATER);\r
- ts.setTexture(texture);\r
- MaterialState ms = editor.getRenderingComponent().getDisplaySystem().getRenderer().createMaterialState();\r
- ms.setEmissive(new ColorRGBA(1.f, 1.f, 1.f, 0.f));\r
- monitorNode.setRenderState(ts);\r
- monitorNode.setRenderState(as);\r
- monitorNode.setRenderState(ms);\r
- graphics.drawLine(0, 33, monitorSize-1, 33);\r
- graphics.update();\r
- }\r
- \r
- public boolean acceptNode(Graph graph, IGraphicsNode node) {\r
- Node selectedParent = node.getGroup();\r
- if (currentParent == null || !selectedParent.equals(currentParent)) {\r
- if (node.getG3DNode(graph).getLocalPosition() != null) {\r
- return true;\r
- } else if (node.getG3DNode(graph).isInstanceOf(ProcessResource.plant3Dresource.VariableLengthInlineComponent)) {\r
- \r
- return true;\r
- }\r
- }\r
-\r
- return false;\r
- }\r
- \r
- public void setNode(Graph graph, IGraphicsNode node) {\r
- G3DNode n = node.getG3DNode(graph);\r
- if (n.getLocalPosition() != null) {\r
- type = Type.POSITION;\r
- monitorNode.setLocalTranslation(new Vector3f(0.f,0.f,0.f));\r
- } else if (n.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthInlineComponent)) {\r
- type = Type.PIPE;\r
- InlineComponent ic = new InlineComponent(n);\r
- start = G3DTools.getPoint(ic.getControlPoint().getPrevious().getLocalPosition());\r
- end = G3DTools.getPoint(ic.getControlPoint().getNext().getLocalPosition());\r
- Vector3d dir = new Vector3d(end);\r
- dir.sub(start);\r
- dir.scale(0.5);\r
- middle = new Point3d(start);\r
- middle.add(dir);\r
- monitorNode.setLocalTranslation(VecmathJmeTools.get(middle));\r
- } else {\r
- return;\r
- }\r
- Node selectedParent = node.getGroup();\r
- this.node = node;\r
- currentParent = selectedParent;\r
- monitorNode.removeFromParent();\r
- currentParent.attachChild(monitorNode);\r
-\r
- provider.setSource(n);\r
- update(graph);\r
- }\r
- \r
- public IGraphicsNode getNode() {\r
- return node;\r
- }\r
- \r
- public void update() {\r
- if (useDistanceResize) {\r
- Vector3f v = VecmathJmeTools.get(editor.getCamera().getCameraPos());\r
- v.subtractLocal(monitorNode.getWorldTranslation());\r
- float length = v.length();\r
- monitorNode.setLocalScale(length * 0.06f);\r
- }\r
- }\r
- \r
- \r
- public void update(Graph graph) {\r
- ArrayList<String> titles = provider.getTexts(graph);\r
- graphics.clearRect(0, 0, monitorSize, monitorSize);\r
- int y = 16;\r
- for (String s : titles) {\r
- graphics.drawString(s, 0, y);\r
- y += 16;\r
- }\r
-\r
- TextureState ts = (TextureState) monitorNode\r
- .getRenderState(RenderState.RS_TEXTURE);\r
- ts.deleteAll(); // FIXME : texture won't be updated without this\r
- graphics.update();\r
- update();\r
- }\r
- \r
- public void remove() {\r
- monitorNode.removeFromParent();\r
- node = null;\r
- }\r
-\r
- /**\r
- * if true, monitors size is independent of distance to camera. Else monitor's size changes when camera is moved.\r
- * @return\r
- */\r
- public boolean isUseDistanceResize() {\r
- return useDistanceResize;\r
- }\r
-\r
- public void setUseDistanceResize(boolean useDistanceResize) {\r
- this.useDistanceResize = useDistanceResize;\r
- if (!useDistanceResize) {\r
- monitorNode.setLocalScale(1.f);\r
- }\r
- }\r
- \r
- public void setTextProvider(MonitorTextProvider provider) {\r
- this.provider = provider;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.monitors;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-\r
-\r
-\r
-\r
-/**\r
- * Interface for monitors (Textual display of objects properties)\r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public interface Monitor {\r
- \r
- /**\r
- * Returns true if monitor can be attached to node\r
- * @param node\r
- * @return\r
- */\r
- public boolean acceptNode(Graph graph,IGraphicsNode node);\r
- \r
- /**\r
- * Returns the scene-graph node where monitor is attached\r
- * @return\r
- */\r
- public IGraphicsNode getNode();\r
-\r
- /**\r
- * Sets monitored node\r
- * @param node\r
- */\r
- public void setNode(Graph graph,IGraphicsNode node);\r
- \r
- /**\r
- * Updates monitor's texts\r
- *\r
- */\r
- public void update();\r
- \r
- public void update(Graph graph);\r
- \r
- /**\r
- * Removes the monitor. \r
- */\r
- public void remove(); \r
- \r
- \r
- public void setTextProvider(MonitorTextProvider provider);\r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.monitors;\r
-\r
-import java.util.ArrayList;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.layer0.utils.IEntity;\r
-\r
-\r
-\r
-public interface MonitorTextProvider {\r
- public void setSource(IEntity instance);\r
- public ArrayList<String> getTexts(Graph graph);\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.monitors;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.List;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.ResourceDebugUtils;\r
-import org.simantics.processeditor.ProcessResource;\r
-\r
-\r
-\r
-\r
-public class ObjectPropertyProvider implements MonitorTextProvider {\r
- \r
- private Resource instance;\r
- private Resource properties[];\r
- String name;\r
- \r
- public void setSource(IEntity instance) {\r
- this.instance = instance.getResource();\r
- Collection<IEntity> props = instance.getRelatedObjects(ProcessResource.builtins.HasProperty);\r
- List<Resource> res = new ArrayList<Resource>();\r
- for (IEntity t : props)\r
- res.add(t.getResource());\r
- properties = new Resource[res.size()];\r
- properties = res.toArray(properties);\r
- name = ResourceDebugUtils.getReadableNameForEntity(instance);\r
- }\r
- \r
- public ArrayList<String> getTexts(Graph graph) {\r
- ArrayList<String> titles = new ArrayList<String>();\r
- if (instance == null)\r
- return titles;\r
- IEntity thing = EntityFactory.create(graph,instance);\r
- name = ResourceDebugUtils.getReadableNameForEntity(thing);\r
- titles.add(name);\r
-\r
- for (Resource p : properties) {\r
- thing = EntityFactory.create(graph,p);\r
- //if (p.isInstanceOf(Builtins.Double)) {\r
- //typeResources = p.getRelatedResources(Builtins.InstanceOf);\r
- //name = PropertyUtils.getScalarStringProperty(typeResources[0],Builtins.HasName);\r
- name = ResourceDebugUtils.getReadableNameForEntity(thing);\r
- titles.add(name);\r
- //}\r
- }\r
- return titles;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.monitors;\r
-\r
-import java.util.Collection;\r
-import java.util.List;\r
-\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.utils.datastructures.MapList;\r
-\r
-\r
-/**\r
- * Container for Paths\r
- * FIXME : singleton\r
- * TODO : removing paths\r
- * TODO : prevent adding same path multiple times\r
- * TODO : how to handle multi-instances?\r
- * \r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public class PathContainer {\r
- \r
- private static PathContainer instance = new PathContainer();\r
- \r
- MapList<Resource, List<Resource>> paths;\r
- //List<Pair<List<Resource>,List<Resource>>> multiInstancePaths;\r
- \r
- private PathContainer() {\r
- paths = new MapList<Resource, List<Resource>>();\r
- //multiInstancePaths = new ArrayList<Pair<List<Resource>,List<Resource>>>();\r
- }\r
- \r
- public List<List<Resource>> getPaths(IEntity instance) {\r
- Collection<IEntity> types = instance.getTypes();\r
- if (types.size() != 1) {\r
- // for multi-instances we check if any of the types have paths\r
- // no we return paths for a single type (it is possible to combine paths for all types)\r
- for (IEntity type : types) {\r
- Resource r = type.getResource();\r
- List<List<Resource>> path = paths.getValues(r);\r
- if (path != null)\r
- return path;\r
- }\r
- return null;\r
- } else {\r
- Resource type = types.iterator().next().getResource();\r
- return paths.getValues(type);\r
- }\r
- }\r
- \r
- public void addPath(Resource type, List<Resource> path) {\r
- paths.add(type, path);\r
- }\r
- \r
- public void clearPaths(Resource type) {\r
- paths.remove(type);\r
- }\r
- \r
- public static PathContainer getInstance() {\r
- return instance;\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.monitors;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.List;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.ResourceDebugUtils;\r
-import org.simantics.processeditor.common.PathUtils;\r
-\r
-\r
-\r
-public class ResourcePathPropertyProvider implements MonitorTextProvider {\r
- \r
- private Resource instance;\r
- private List<Resource> properties = new ArrayList<Resource>();\r
- private List<String> names = new ArrayList<String>();\r
- private List<String> units = new ArrayList<String>();\r
- String name;\r
- \r
- private MonitorTextProvider provider = new ObjectPropertyProvider();\r
- \r
- public void setSource(IEntity instance) {\r
- this.instance = instance.getResource();\r
- properties.clear();\r
- names.clear();\r
- //units.clear();\r
- List<List<Resource>> paths = PathContainer.getInstance().getPaths(instance);\r
- if (paths != null) {\r
- for (List<Resource> path : paths) {\r
- IEntity source = PathUtils.findSimilar(path, instance);\r
- if (source != null)\r
- properties.add(source.getResource());\r
- }\r
- }\r
- Collection<IEntity> types = instance.getTypes();\r
- name = ResourceDebugUtils.getReadableNameForEntity(types.iterator().next());\r
- for (Resource p : properties) {\r
- names.add(ResourceDebugUtils.getReadableNameForEntity(EntityFactory.create(instance.getGraph(),p)));\r
-// if (p.isInstanceOf(Builtins.Double)) {\r
-// typeResources = p.getRelatedResources(Builtins.InstanceOf);\r
-// String name = PropertyUtils.getScalarStringProperty(typeResources[0],Builtins.HasName);\r
-// Property property = new Property(p);\r
-// String abbr = property.getUnitAbbreviation();\r
-// names.add(name);\r
-// if (abbr != null)\r
-// units.add(abbr);\r
-// else\r
-// units.add("");\r
-// //titles.add(name + " " + PropertyUtils.getDoubleValue(p)[0] + " " + abbr);\r
-// }\r
- }\r
- provider.setSource(instance);\r
- }\r
- \r
- public ArrayList<String> getTexts(Graph graph) {\r
- if (properties.size() == 0)\r
- return provider.getTexts(graph);\r
- ArrayList<String> titles = new ArrayList<String>();\r
- if (instance == null)\r
- return titles;\r
- \r
- titles.add(name);\r
- for (int i = 0; i < properties.size(); i++) {\r
- //titles.add(names.get(i) + " " + Double.toString(PropertyUtils.getDoubleValue(properties.get(i))[0]) + " " + units.get(i));\r
- // FIXME : check value\r
- titles.add(names.get(i) + " " + EntityFactory.create(graph,properties.get(i)).toProperty().getValue());\r
- }\r
-\r
- return titles;\r
- }\r
- \r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.monitors;\r
-\r
-import java.net.URL;\r
-import java.util.ArrayList;\r
-\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.eclipse.core.runtime.FileLocator;\r
-import org.eclipse.core.runtime.Path;\r
-import org.eclipse.swt.graphics.Rectangle;\r
-import org.simantics.db.Graph;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.stubs.InlineComponent;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.MathTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.base.VecmathJmeTools;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-\r
-import com.jme.image.Texture;\r
-import com.jme.math.Vector2f;\r
-import com.jme.math.Vector3f;\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.renderer.Renderer;\r
-import com.jme.scene.Node;\r
-import com.jme.scene.Text;\r
-import com.jme.scene.shape.Quad;\r
-import com.jme.scene.state.AlphaState;\r
-import com.jme.scene.state.MaterialState;\r
-import com.jme.scene.state.RenderState;\r
-import com.jme.scene.state.TextureState;\r
-import com.jme.util.TextureManager;\r
-\r
-\r
-/**\r
- * A monitor implemetation that uses JME's text component to show it's information. \r
- * \r
- * @author Marko Luukkainen\r
- *\r
- */\r
-public class TextMonitor implements Monitor {\r
- private enum Type{POSITION,PIPE};\r
- private Type type;\r
- \r
- public static String fontLocation = "data/textures/tahoma512.png";\r
- \r
- \r
- private ThreeDimensionalEditorBase editor;\r
- private ArrayList<Text> texts = new ArrayList<Text>();\r
- private Node monitorNode = new Node("");\r
- Node textNode;\r
- private IGraphicsNode node = null;\r
- \r
- Point3d start;\r
- Point3d end;\r
- Point3d middle;\r
- \r
- float width = 0.f;\r
- float height = 0.f;\r
- float textHeight = 0.f;\r
- \r
- Quad background;\r
- \r
- private MonitorTextProvider provider = new ObjectPropertyProvider();\r
- \r
- public TextMonitor(ThreeDimensionalEditorBase editor) {\r
- this.editor = editor;\r
- textNode = new Node("");\r
- \r
- \r
- \r
- AlphaState as1 = editor.getRenderingComponent().getDisplaySystem().getRenderer().createAlphaState();\r
- as1.setBlendEnabled(true);\r
- as1.setSrcFunction(AlphaState.SB_SRC_ALPHA);\r
- as1.setDstFunction(AlphaState.DB_ONE_MINUS_SRC_ALPHA);\r
- as1.setTestEnabled(true);\r
- as1.setTestFunction(AlphaState.TF_GREATER);\r
- as1.setEnabled(true);\r
- \r
- MaterialState ms = editor.getRenderingComponent().getDisplaySystem().getRenderer().createMaterialState();\r
- ms.setEmissive(new ColorRGBA(0.f,1.f,0.f,0.f));\r
- \r
- TextureState font = editor.getRenderingComponent().getDisplaySystem().getRenderer().createTextureState();\r
- /** The texture is loaded from fontLocation */\r
- font.setTexture(loadFontTexture());\r
- font.setEnabled(true);\r
- textNode.setRenderState(font);\r
- textNode.setRenderState(as1);\r
- textNode.setRenderState(ms);\r
- background = new Quad("",100.f,100.f);\r
- \r
- MaterialState ms2 = editor.getRenderingComponent().getDisplaySystem().getRenderer().createMaterialState();\r
- ms2.setEmissive(new ColorRGBA(0.f,0.f,0.f,0.8f));\r
- ms2.setDiffuse(new ColorRGBA(0.f,0.f,0.f,0.8f));\r
-\r
- AlphaState as2 = editor.getRenderingComponent().getDisplaySystem().getRenderer().createAlphaState();\r
- as2.setBlendEnabled(true);\r
- as2.setSrcFunction(AlphaState.SB_SRC_ALPHA);\r
- as2.setDstFunction(AlphaState.DB_ONE_MINUS_SRC_ALPHA);\r
- as2.setTestEnabled(true);\r
- as2.setTestFunction(AlphaState.TF_GREATER);\r
- as2.setEnabled(true);\r
- monitorNode.setRenderState(ms2);\r
- monitorNode.setRenderState(as2);\r
- \r
- background.setRenderQueueMode(Renderer.QUEUE_ORTHO);\r
- textNode.setRenderQueueMode(Renderer.QUEUE_ORTHO);\r
- \r
- monitorNode.attachChild(background);\r
- monitorNode.attachChild(textNode);\r
- // editor.getRenderingComponent().getOrthoNode().attachChild(monitorNode);\r
- \r
- \r
- }\r
- \r
- public boolean acceptNode(Graph graph,IGraphicsNode node) {\r
- G3DNode n = node.getG3DNode(graph);\r
- if (this.node == null || !node.equals(this.node)) {\r
- if (n.getLocalPosition() != null) {\r
- return true;\r
- } else if (n.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthInlineComponent)) {\r
- return true;\r
- }\r
- }\r
-\r
- return false;\r
-\r
- }\r
- \r
- public void setNode(Graph graph, IGraphicsNode node) {\r
- G3DNode n = node.getG3DNode(graph);\r
- if (n.getLocalPosition() != null) {\r
- type = Type.POSITION;\r
- } else if (n.isInstanceOf(ProcessResource.plant3Dresource.VariableLengthInlineComponent)) {\r
- type = Type.PIPE;\r
- InlineComponent ic = new InlineComponent(n);\r
- start = G3DTools.getPoint(ic.getControlPoint().getPrevious().getWorldPosition());\r
- end = G3DTools.getPoint(ic.getControlPoint().getNext().getWorldPosition());\r
- Vector3d dir = new Vector3d(end);\r
- dir.sub(start);\r
- dir.scale(0.5);\r
- middle = new Point3d(start);\r
- middle.add(dir);\r
- } else {\r
- return;\r
- }\r
- \r
- this.node = node;\r
- provider.setSource(n);\r
- ArrayList<String> titles = provider.getTexts(graph);\r
- \r
- for (int i = titles.size() - 1; i < texts.size(); i++) {\r
- texts.get(i).removeFromParent();\r
- }\r
- while (texts.size() < titles.size()) {\r
- Text text = new Text("", "");\r
- texts.add(text);\r
- textNode.attachChild(text);\r
- }\r
- width = 0.f;\r
- height = 0.f;\r
- for (int i = 0; i < titles.size(); i++) {\r
- Text text = texts.get(i);\r
- text.print(titles.get(i));\r
- width = Math.max(width,text.getWidth());\r
- textHeight = text.getHeight();\r
- height += textHeight;\r
- textNode.attachChild(text);\r
- }\r
- background.resize(width+20.f, height+10.f);\r
- if (monitorNode.getParent() == null)\r
- editor.getScenegraphAdapter().getRoot().attachChild(monitorNode);\r
- \r
- }\r
- \r
- private void updateText(Graph graph) {\r
- ArrayList<String> titles = provider.getTexts(graph);\r
- float newWidth = 0.f;\r
- for (int i = 0; i < titles.size(); i++) {\r
- Text text = texts.get(i);\r
- text.print(titles.get(i));\r
- newWidth = Math.max(newWidth,text.getWidth());\r
- }\r
- if (newWidth != width) {\r
- width = newWidth;\r
- background.resize(width+20.f, height+10.f);\r
- }\r
- \r
- }\r
- \r
- public void update() {\r
- if (node == null)\r
- return;\r
- Vector2f v;\r
- \r
- if (type == Type.POSITION) {\r
- v = editor.getScreenCoord(VecmathJmeTools.getD(node.getGroup().getWorldTranslation()));\r
- } else {\r
- float mx = editor.getRenderingComponent().getDisplaySystem().getWidth();\r
- float my = editor.getRenderingComponent().getDisplaySystem().getHeight();\r
- Vector2f s = editor.getScreenCoord(start);\r
- Vector2f e = editor.getScreenCoord(end);\r
- Vector2f rs = new Vector2f();\r
- Vector2f re = new Vector2f();\r
- boolean in = MathTools.clipLineRectangle(s, e, new Vector2f(0.f,0.f), new Vector2f(mx,my), rs, re);\r
- if (in) {\r
- re.subtractLocal(rs);\r
- re.multLocal(0.5f);\r
- rs.addLocal(re);\r
- v = rs;\r
- } else {\r
- // just a hack to move monitor out of the view\r
- v = new Vector2f (mx+width,my+height);\r
- }\r
- \r
- \r
- }\r
- background.setLocalTranslation(new Vector3f(v.x,v.y,0.f));\r
- float y = v.y + (height * 0.5f) - textHeight;\r
- v.x -= width * 0.5f;\r
- \r
- for (Text text : texts) {\r
- text.setLocalTranslation(new Vector3f(v.x,y,0.f));\r
- y -= textHeight;\r
- }\r
- \r
- \r
- \r
- }\r
- \r
- @Override\r
- public void update(Graph graph) {\r
- updateText(graph);\r
- update();\r
- }\r
- \r
- public IGraphicsNode getNode() {\r
- return node;\r
- }\r
- \r
- public void remove() {\r
- monitorNode.removeFromParent();\r
- node = null;\r
- }\r
- \r
- protected Texture loadFontTexture() {\r
- URL url = FileLocator.find(com.jme.eclipse.Activator.getDefault().getBundle(),new Path(fontLocation),null);\r
- return TextureManager.loadTexture(url, Texture.MM_LINEAR,\r
- Texture.FM_LINEAR);\r
- }\r
- \r
- public void setTextProvider(MonitorTextProvider provider) {\r
- this.provider = provider;\r
- }\r
- \r
- \r
-\r
- \r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.perspectives;\r
-\r
-import org.eclipse.ui.IPageLayout;\r
-import org.eclipse.ui.IPerspectiveFactory;\r
-\r
-public class Plant3DModellingPerspective implements IPerspectiveFactory{\r
- \r
- @Override\r
- public void createInitialLayout(IPageLayout layout) {\r
- \r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.perspectives;\r
-\r
-import java.util.Collection;\r
-\r
-import org.simantics.db.Builtins;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.layer0.utils.Statement;\r
-import org.simantics.layer0.utils.viewpoints.AcceptDecision;\r
-import org.simantics.layer0.utils.viewpoints.AcceptRule;\r
-import org.simantics.layer0.utils.viewpoints.PlainStateFactory;\r
-import org.simantics.layer0.utils.viewpoints.ResourceViewpoint;\r
-import org.simantics.layer0.utils.viewpoints.State;\r
-import org.simantics.layer0.utils.viewpoints.StateFactory;\r
-import org.simantics.layer0.utils.viewpoints.TraversalDecision;\r
-import org.simantics.layer0.utils.viewpoints.TraversalRule;\r
-import org.simantics.layer0.utils.viewpoints.rules.AcceptAllResourceAcceptRule;\r
-import org.simantics.processeditor.ProcessResource;\r
-\r
-\r
-public class ViewpointGenerator {\r
- public static ResourceViewpoint createViewpoint() {\r
- StateFactory f = new PlainStateFactory();\r
- final State rootState = f.newState();\r
- final State projectState = f.newState();\r
- final State libraryState = f.newState();\r
- \r
- return new ResourceViewpoint(new TraversalRule() {\r
- @Override\r
- public TraversalDecision makeTraversalDecision(State state, Statement statement) {\r
- Builtins b = statement.getGraph().getBuiltins();\r
- if (state.equals(rootState)) {\r
- if (statement.getObject().isInstanceOf(b.Ontology))\r
- return TraversalDecision.stopTraversal;\r
- if(!statement.getPredicate().equals(b.ConsistsOf))\r
- return TraversalDecision.stopTraversal;\r
- return TraversalDecision.continueTraversal(projectState);\r
- } else if (state.equals(projectState)) {\r
- if(!statement.getPredicate().equals(b.ConsistsOf))\r
- return TraversalDecision.stopTraversal;\r
- return TraversalDecision.continueTraversal(libraryState);\r
- } else if (state.equals(libraryState)) {\r
- if(!statement.getPredicate().equals(b.ConsistsOf))\r
- return TraversalDecision.stopTraversal;\r
- return TraversalDecision.continueTraversal(libraryState);\r
- }\r
- return TraversalDecision.stopTraversal;\r
- }\r
- \r
- @Override\r
- public boolean areAllStatesRelevant() {\r
- return true;\r
- }\r
- \r
- @Override\r
- public Collection<State> relevantStates() {\r
- return null;\r
- }\r
- }, new AcceptRule<IEntity>() {\r
- @Override\r
- public AcceptDecision makeAcceptDecision(State state, IEntity obj) {\r
- Builtins b = obj.getGraph().getBuiltins();\r
- //NOSEResource nr = NOSEResource.getInstance(obj.getGraph());\r
- if(obj.isInstanceOf(b.Project)) return AcceptDecision.REJECT;\r
- else if (obj.isInstanceOf(b.Ontology)) return AcceptDecision.REJECT;\r
- else return AcceptDecision.ACCEPT;\r
- }\r
- \r
- @Override\r
- public boolean areAllStatesRelevant() {\r
- return true;\r
- }\r
- \r
- @Override\r
- public Collection<State> relevantStates() {\r
- return null;\r
- }\r
- }, rootState);\r
- }\r
- \r
- public static ResourceViewpoint createObjectStructureViewpoint() {\r
- StateFactory f = new PlainStateFactory();\r
- final State rootState = f.newState();\r
-\r
- return new ResourceViewpoint(new TraversalRule() {\r
- @Override\r
- public TraversalDecision makeTraversalDecision(State state,\r
- Statement statement) {\r
- if (state.equals(rootState)) {\r
- if (!statement.getPredicate().isSubrelationOf(\r
- ProcessResource.g3dResource.HasChild))\r
- return TraversalDecision.stopTraversal;\r
- return TraversalDecision.continueTraversal(rootState);\r
- }\r
- return TraversalDecision.stopTraversal;\r
- }\r
-\r
- @Override\r
- public boolean areAllStatesRelevant() {\r
- return true;\r
- }\r
-\r
- @Override\r
- public Collection<State> relevantStates() {\r
- return null;\r
- }\r
- }, new AcceptAllResourceAcceptRule(), rootState);\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.scenegraph;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.scenegraph.NonTransformableNode;\r
-\r
-\r
-public class NonVisibleNode extends NonTransformableNode {\r
-\r
- public NonVisibleNode(IGraphicsNode parent, Graph graph, Resource resource) {\r
- super(parent,resource);\r
- if (!getG3DNode(graph).isInstanceOf(ProcessResource.plant3Dresource.NonVisibleComponent))\r
- throw new RuntimeException("Resource must be instance of NonVisibleComponent");\r
- \r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.scenegraph;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.List;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.Quat4d;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.common.ControlPointTools;\r
-import org.simantics.processeditor.common.PipingTools;\r
-import org.simantics.processeditor.stubs.CodedComponent;\r
-import org.simantics.processeditor.stubs.PipeControlPoint;\r
-import org.simantics.processeditor.stubs.Plant3DResource;\r
-import org.simantics.processeditor.stubs.SizeChangeControlPoint;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.scenegraph.ShapeNode;\r
-\r
-import com.jme.math.Quaternion;\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.scene.Geometry;\r
-import com.jme.scene.state.MaterialState;\r
-import com.jme.scene.state.RenderState;\r
-\r
-\r
-\r
-/**\r
- * This is for hard-coded geometries\r
- * TODO : we need an extension point for geometries,\r
- * so that other code-based geometries can be supported\r
- * \r
- * \r
- * @author Marko Luukkainen <Marko.Luukkainen@vtt.fi>\r
- *\r
- */\r
-public class PipeComponentNode extends ShapeNode {\r
- \r
- enum Type{ELBOW,STRAIGHT,REDUCER};\r
- \r
- Type type;\r
- Resource controlPoint;\r
-\r
- \r
- public PipeComponentNode(ThreeDimensionalEditorBase editor, IGraphicsNode parent, Graph graph, Resource resource) {\r
- super(editor, parent, graph, resource);\r
- CodedComponent component = new CodedComponent(graph,resource);\r
- PipeControlPoint cp = component.getControlPoint();\r
- Plant3DResource p3r = ProcessResource.plant3Dresource;\r
- controlPoint = cp.getResource();\r
- \r
- if (component.isInstanceOf(p3r.Elbow)) {\r
- type = Type.ELBOW; \r
- } else if (component.isInstanceOf(p3r.Straight)) {\r
- type = Type.STRAIGHT;\r
- } else if (component.isInstanceOf(p3r.Elbow)) {\r
- type = Type.REDUCER;\r
- }\r
- \r
- \r
- }\r
- \r
- @Override\r
- public Collection<RenderState> getMaterial() {\r
- MaterialState ms = null;\r
- ms = editor.getRenderingComponent().getDisplaySystem().getRenderer().createMaterialState();\r
- ms.setEmissive(new ColorRGBA(0.f,0.f,0.f,0.f));\r
- ms.setSpecular(new ColorRGBA(1.f,1.f,1.f,1.f));\r
- ms.setEnabled(true);\r
- ms.setShininess(128.f);\r
- if (type == Type.ELBOW) {\r
- ms.setDiffuse(new ColorRGBA(0.5f,0.5f,0.5f,0.f));\r
- ms.setAmbient(new ColorRGBA(0.5f,0.5f,0.5f,0.f));\r
- } else if (type == Type.STRAIGHT) {\r
- ms.setDiffuse(new ColorRGBA(0.75f,0.75f,0.75f,0.f));\r
- ms.setAmbient(new ColorRGBA(0.75f,0.75f,0.75f,0.f));\r
- } else {\r
- ms.setDiffuse(new ColorRGBA(0.6f,0.6f,0.6f,0.f));\r
- ms.setAmbient(new ColorRGBA(0.6f,0.6f,0.6f,0.f));\r
- } \r
- List<RenderState> states = new ArrayList<RenderState>();\r
- states.add(ms);\r
- return states;\r
- }\r
- \r
- \r
- @Override\r
- public void updateTransform(Graph graph) {\r
- if (type == Type.REDUCER) {\r
- SizeChangeControlPoint sccp = new SizeChangeControlPoint(graph, controlPoint);\r
- Quat4d q = ControlPointTools.getControlPointLocalOrientationQuat(sccp, sccp.getRotationAngle()[0], true);\r
- update(q);\r
- } \r
- if (type != Type.STRAIGHT) {\r
- super.updateTransform(graph);\r
- } else {\r
- transform.setLocalTranslation(0.f,0.f,0.f);\r
- transform.setLocalRotation(new Quaternion());\r
- }\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.scenegraph;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.scenegraph.NonTransformableNode;\r
-\r
-\r
-public class PipeRunNode extends NonTransformableNode {\r
-\r
- public PipeRunNode(IGraphicsNode parent, Graph graph, Resource resource) {\r
- super(parent,resource);\r
- if (!getG3DNode(graph).isInstanceOf(ProcessResource.plant3Dresource.PipeRun))\r
- throw new RuntimeException("Resource must be instance of Pipeline");\r
- \r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.scenegraph;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.common.ControlPointTools;\r
-import org.simantics.processeditor.stubs.PipeControlPoint;\r
-import org.simantics.processeditor.stubs.PipelineComponent;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.scenegraph.ParameterizedModelNode;\r
-\r
-\r
-\r
-\r
-public class PipelineComponentNode extends ParameterizedModelNode {\r
-\r
- boolean updating = false;\r
- \r
- public PipelineComponentNode(ThreeDimensionalEditorBase editor, IGraphicsNode parent, Graph graph, Resource resource) {\r
- super(editor,parent,graph, resource, ProcessResource.plant3Dresource.HasGraphics);\r
- PipelineComponent component = new PipelineComponent(graph, resource);\r
- if(!component.isInstanceOf(ProcessResource.plant3Dresource.PipelineComponent))\r
- throw new RuntimeException("Resource must be instance of Inline Component " + resource);\r
- if (!(parent instanceof PipeRunNode))\r
- throw new RuntimeException("Parent must be instance of PipelineNode " + parent.getResource() + " " + resource);\r
-\r
- //PipeControlPoint pcp = component.getControlPoint();\r
-// monitor = new StructuralChangeMonitor(\r
-// new StructuralChangeListener[] { this }, pcp.getResource(), GlobalIdMap\r
-// .get(Layer0Mapping.HAS_PROPERTY));\r
- updateTransform(graph);\r
- }\r
- \r
-// public void handleUpdate(StructuralChangeMonitor monitor, GraphChangeEvent event) {\r
-// if (updating)\r
-// return;\r
-// if (event.getParameter() instanceof InlineComponentNode)\r
-// return;\r
-// if (event.getTransactionId() == null)\r
-// return;\r
-// if (event.getParameter() instanceof AbstractGraphicsNode)\r
-// return;\r
-//\r
-// updating = true;\r
-// updateTransform();\r
-// updating = false;\r
-// }\r
- \r
- public void updateTransform(Graph graph) {\r
- super.updateTransform(graph);\r
- /*\r
- PipelineComponent component = new PipelineComponent(graph,shapeResource);\r
- \r
- PipeControlPoint pcp = component.getControlPoint();\r
- Double angle = component.getAtMostOneRelatedScalarDouble(ProcessResource.plant3Dresource.HasRotationAngle);\r
- double componentAngle = 0.0;\r
- if (angle != null)\r
- componentAngle = angle;\r
-\r
- AxisAngle4d aa = ControlPointTools.getControlPointRotation(pcp, componentAngle);\r
- update(aa);\r
- */\r
- }\r
- \r
- \r
- public void dispose() {\r
- //monitor.dispose();\r
- super.dispose();\r
- }\r
- \r
-\r
- \r
-\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.tools;\r
-\r
-import java.io.ByteArrayInputStream;\r
-import java.io.ByteArrayOutputStream;\r
-import java.net.URL;\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.List;\r
-\r
-import javax.vecmath.AxisAngle4d;\r
-import javax.vecmath.Point3d;\r
-import javax.vecmath.Quat4d;\r
-import javax.vecmath.Vector3d;\r
-\r
-import org.eclipse.core.runtime.FileLocator;\r
-import org.eclipse.core.runtime.Path;\r
-import org.eclipse.jface.action.IMenuManager;\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.SelectionAdapter;\r
-import org.eclipse.swt.events.SelectionEvent;\r
-import org.eclipse.swt.layout.FormAttachment;\r
-import org.eclipse.swt.layout.FormData;\r
-import org.eclipse.swt.layout.FormLayout;\r
-import org.eclipse.swt.layout.GridLayout;\r
-import org.eclipse.swt.widgets.Button;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.processeditor.Activator;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.common.PipeComponentProvider;\r
-import org.simantics.processeditor.stubs.DirectedControlPoint;\r
-import org.simantics.processeditor.stubs.PipeControlPoint;\r
-import org.simantics.proconf.g3d.actions.ContextAction;\r
-import org.simantics.proconf.g3d.base.EditorContribution;\r
-import org.simantics.proconf.g3d.base.G3DTools;\r
-import org.simantics.proconf.g3d.base.MathTools;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.base.VecmathJmeTools;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-import org.simantics.utils.ui.ErrorLogger;\r
-\r
-import com.jme.renderer.ColorRGBA;\r
-import com.jme.scene.Geometry;\r
-import com.jme.scene.Node;\r
-import com.jme.scene.Spatial;\r
-import com.jme.scene.TriMesh;\r
-import com.jme.scene.shape.Sphere;\r
-import com.jme.scene.state.MaterialState;\r
-import com.jme.util.export.Savable;\r
-import com.jme.util.export.binary.BinaryImporter;\r
-import com.jmex.model.converters.ObjToJme;\r
-\r
-\r
-public class ControlPointContribution implements EditorContribution {\r
- private List<ContextAction> actions = new ArrayList<ContextAction>();\r
- private ThreeDimensionalEditorBase parent;\r
- private Resource componentResource;\r
- private Resource controlPointResource;\r
- \r
- private Composite sideComposite;\r
- \r
- private double radius = 0.2;\r
- private double radius2 = 0.1;\r
- private double angle = Math.PI / 4.0;\r
- \r
- public ControlPointContribution(ThreeDimensionalEditorBase parent) {\r
- this.parent = parent;\r
- }\r
- \r
- @Override\r
- public void createControl(Composite parent) {\r
- FormLayout flayout = new FormLayout();\r
- parent.setLayout(flayout);\r
- sideComposite = new Composite(parent,SWT.BORDER);\r
- FormData data = new FormData();\r
- data.top = new FormAttachment(0, 0);\r
- data.left = new FormAttachment(0, 0);\r
- data.right = new FormAttachment(sideComposite, 0, SWT.LEFT);\r
- data.bottom = new FormAttachment(100,0);\r
- this.parent.getRenderingComposite().setLayoutData(data);\r
- GridLayout layout = new GridLayout(1,false);\r
- layout.marginHeight = 1;\r
- layout.marginWidth = 1;\r
- sideComposite.setLayout(layout);\r
- data = new FormData();\r
- data.top = new FormAttachment(0, 0);\r
- data.bottom = new FormAttachment(100,0);\r
- data.right = new FormAttachment(100,0);\r
- sideComposite.setLayoutData(data);\r
- \r
- Button showCPButton = new Button(sideComposite,SWT.TOGGLE);\r
- showCPButton.setText("Show CtrlPts");\r
- showCPButton.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- Button b = (Button)e.widget;\r
- showControlPoints(b.getSelection());\r
- }\r
- });\r
- \r
- Button addCPButton = new Button(sideComposite,SWT.PUSH);\r
- addCPButton.setText("Add CtrlPt");\r
- addCPButton.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- addControlPoint();\r
- }\r
- });\r
- \r
- Button removeCPButton = new Button(sideComposite,SWT.PUSH);\r
- removeCPButton.setText("Remove CtrlPt");\r
- removeCPButton.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- \r
- }\r
- });\r
- \r
- Button showPipesButton = new Button(sideComposite,SWT.TOGGLE);\r
- showPipesButton.setText("Pipes");\r
- showPipesButton.addSelectionListener(new SelectionAdapter() {\r
- @Override\r
- public void widgetSelected(SelectionEvent e) {\r
- Button b = (Button)e.widget;\r
- showPipes(b.getSelection());\r
- }\r
- });\r
- \r
- \r
- }\r
- \r
- @Override\r
- public void disposeControl() {\r
- sideComposite.dispose(); \r
- }\r
- \r
- @Override\r
- public void fillContextMenu(Graph graph, IMenuManager manager,\r
- StructuredResourceSelection selection) {\r
-\r
- }\r
- \r
- @Override\r
- public void fillLocalPullDown(IMenuManager manager) {\r
-\r
- }\r
- \r
- @Override\r
- public void fillLocalToolBar(IToolBarManager manager) {\r
-\r
- }\r
- \r
- @Override\r
- public Collection<ContextAction> getActions() {\r
- return actions;\r
- }\r
- \r
- @Override\r
- public String getName() {\r
- return "Control Points";\r
- }\r
- \r
- List<Node> pipes = new ArrayList<Node>();\r
- List<Node> controlPoints = new ArrayList<Node>();\r
- \r
- private void showPipes(boolean show) {\r
- if (show) {\r
- if (!pipes.isEmpty()) {\r
- for (Node n : pipes) {\r
- n.removeFromParent();\r
- n.dispose();\r
- }\r
- pipes.clear();\r
- }\r
- parent.getSession().asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- PipeControlPoint pcp = new PipeControlPoint(g,controlPointResource);\r
- if (pcp.isInstanceOf(ProcessResource.plant3Dresource.EndComponentControlPoint)) {\r
- Node n = new Node();\r
- TriMesh mesh = new TriMesh();\r
- Point3d p1 = new Point3d(-10.0,0.0,0.0);\r
- Point3d p2 = new Point3d( 0.0,0.0,0.0);\r
- PipeComponentProvider.createStraightGeometry(p1, p2, radius, new Geometry[]{mesh});\r
- n.attachChild(mesh);\r
- parent.getRenderingComponent().getShadowRoot().attachChild(n);\r
- pipes.add(n);\r
- \r
- } else if (pcp.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint)) {\r
- \r
- double length = 0.5;\r
- Double d = pcp.getAtMostOneRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength);\r
- if (d != null)\r
- length = d;\r
- \r
- double offset = 0.0;\r
- d = pcp.getAtMostOneRelatedScalarDouble(ProcessResource.plant3Dresource.HasOffset);\r
- if (d != null)\r
- offset = d;\r
- \r
- double r = radius;\r
- if (pcp.isInstanceOf(ProcessResource.plant3Dresource.SizeChangeControlPoint)) {\r
- r = radius2;\r
- }\r
- \r
- Node n = new Node();\r
- TriMesh mesh = new TriMesh();\r
- Point3d p1 = new Point3d(-10.0,0.0,0.0);\r
- Point3d p2 = new Point3d( -length*0.5,0.0,0.0);\r
- \r
- PipeComponentProvider.createStraightGeometry(p1, p2, radius, new Geometry[]{mesh});\r
- n.attachChild(mesh);\r
- parent.getRenderingComponent().getShadowRoot().attachChild(n);\r
- pipes.add(n);\r
- \r
- n = new Node();\r
- mesh = new TriMesh();\r
- p1 = new Point3d(10.0,offset,0.0);\r
- p2 = new Point3d(length*0.5,offset,0.0);\r
- \r
- PipeComponentProvider.createStraightGeometry(p1, p2, r, new Geometry[]{mesh});\r
- n.attachChild(mesh);\r
- parent.getRenderingComponent().getShadowRoot().attachChild(n);\r
- pipes.add(n); \r
- \r
- } else if (pcp.isInstanceOf(ProcessResource.plant3Dresource.InlineControlPoint)) {\r
- double length = 0.5;\r
- Double d = pcp.getAtMostOneRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength);\r
- if (d != null)\r
- length = d;\r
- \r
- Node n = new Node();\r
- TriMesh mesh = new TriMesh();\r
- Point3d p1 = new Point3d(-10.0,0.0,0.0);\r
- Point3d p2 = new Point3d( -length*0.5,0.0,0.0);\r
- \r
- PipeComponentProvider.createStraightGeometry(p1, p2, radius, new Geometry[]{mesh});\r
- n.attachChild(mesh);\r
- parent.getRenderingComponent().getShadowRoot().attachChild(n);\r
- pipes.add(n);\r
- \r
- n = new Node();\r
- mesh = new TriMesh();\r
- p1 = new Point3d(10.0,0.0,0.0);\r
- p2 = new Point3d(length*0.5,0.0,0.0);\r
- \r
- PipeComponentProvider.createStraightGeometry(p1, p2, radius, new Geometry[]{mesh});\r
- n.attachChild(mesh);\r
- parent.getRenderingComponent().getShadowRoot().attachChild(n);\r
- pipes.add(n);\r
- } else if (pcp.isInstanceOf(ProcessResource.plant3Dresource.TurnControlPoint)) {\r
- double length = 0.5;\r
- Double d = pcp.getAtMostOneRelatedScalarDouble(ProcessResource.plant3Dresource.HasLength);\r
- if (d != null)\r
- length = d;\r
- \r
- Node n = new Node();\r
- TriMesh mesh = new TriMesh();\r
- Point3d p1 = new Point3d(-10.0,0.0,0.0);\r
- Point3d p2 = new Point3d( -length*0.5,0.0,0.0);\r
- \r
- PipeComponentProvider.createStraightGeometry(p1, p2, radius, new Geometry[]{mesh});\r
- n.attachChild(mesh);\r
- parent.getRenderingComponent().getShadowRoot().attachChild(n);\r
- pipes.add(n);\r
- \r
- n = new Node();\r
- mesh = new TriMesh();\r
- p1 = new Point3d(10.0,0.0,0.0);\r
- p2 = new Point3d(length*0.5,0.0,0.0);\r
- Quat4d q = new Quat4d();\r
- q.set(new AxisAngle4d(0.0,1.0,0.0,angle));\r
- MathTools.rotate(q, p1, p1);\r
- MathTools.rotate(q, p2, p2);\r
-\r
- PipeComponentProvider.createStraightGeometry(p1, p2, radius, new Geometry[]{mesh});\r
- n.attachChild(mesh);\r
- parent.getRenderingComponent().getShadowRoot().attachChild(n);\r
- pipes.add(n);\r
- } else if (pcp.isInstanceOf(ProcessResource.plant3Dresource.DirectedControlPoint)) {\r
- Node n = new Node();\r
- TriMesh mesh = new TriMesh();\r
- Point3d p1 = new Point3d(10.0,0.0,0.0);\r
- Point3d p2 = new Point3d( 0.0,0.0,0.0);\r
- PipeComponentProvider.createStraightGeometry(p1, p2, radius, new Geometry[]{mesh});\r
- n.attachChild(mesh);\r
- parent.getRenderingComponent().getShadowRoot().attachChild(n);\r
- pipes.add(n);\r
- }\r
- \r
- if(!pcp.isInstanceOf(ProcessResource.plant3Dresource.DualInlineControlPoint)) {\r
- Collection<PipeControlPoint> subPoints = pcp.getSubPoint();\r
- \r
- }\r
- \r
- parent.setViewChanged(true);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- } else {\r
- if (!pipes.isEmpty()) {\r
- for (Node n : pipes) {\r
- n.removeFromParent();\r
- n.dispose();\r
- }\r
- pipes.clear();\r
- parent.setViewChanged(true);\r
- }\r
- }\r
- }\r
- \r
- private void showControlPoints(boolean show) {\r
- if (show) {\r
- if (!controlPoints.isEmpty()) {\r
- for (Node n : controlPoints) {\r
- n.removeFromParent();\r
- n.dispose();\r
- }\r
- \r
- }\r
- parent.getSession().asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- \r
- PipeControlPoint pcp = new PipeControlPoint(g,controlPointResource);\r
- Vector3d p = G3DTools.getVector(pcp.getWorldPosition());\r
- Node n = new Node();\r
- Spatial sphere = new Sphere("",5,8,0.1f);\r
- n.attachChild(sphere);\r
- n.setLocalTranslation(VecmathJmeTools.get(p));\r
- MaterialState ms = parent.getRenderingComponent().getDisplaySystem().getRenderer().createMaterialState();\r
- ms.setDiffuse(new ColorRGBA(1.f,0.f,0.f,0.f));\r
- sphere.setRenderState(ms);\r
- sphere.setName(Long.toString(pcp.getResource().getResourceId()));\r
- parent.getRenderingComponent().getNoShadowRoot().attachChild(n);\r
- controlPoints.add(n);\r
- Collection<PipeControlPoint> subPoints = pcp.getSubPoint();\r
- ms = parent.getRenderingComponent().getDisplaySystem().getRenderer().createMaterialState();\r
- ms.setDiffuse(new ColorRGBA(0.f,1.f,0.f,0.f));\r
- for (PipeControlPoint cp : subPoints) {\r
- p = G3DTools.getVector(cp.getWorldPosition());\r
- n = new Node();\r
- if (cp.isInstanceOf(ProcessResource.plant3Dresource.DirectedControlPoint)) {\r
- sphere = getDCPMesh();\r
- if (sphere == null)\r
- sphere = new Sphere("",5,8,0.1f);\r
- } else {\r
- sphere = new Sphere("",5,8,0.1f);\r
- }\r
- sphere.setName(Long.toString(cp.getResource().getResourceId()));\r
- n.attachChild(sphere);\r
- n.setLocalTranslation(VecmathJmeTools.get(p));\r
- sphere.setRenderState(ms);\r
- parent.getRenderingComponent().getNoShadowRoot().attachChild(n);\r
- controlPoints.add(n);\r
- }\r
- parent.setViewChanged(true);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- } else {\r
- if (!controlPoints.isEmpty()) {\r
- for (Node n : controlPoints) {\r
- n.removeFromParent();\r
- n.dispose();\r
- }\r
- parent.setViewChanged(true);\r
- }\r
- }\r
- }\r
- \r
- @Override\r
- public void initialize(Graph graph) {\r
- Resource modelResource = parent.getInputResource();\r
- Resource inverse = graph.getInverse(ProcessResource.plant3Dresource.HasGraphics);\r
- Collection<Resource> equipment = graph.getObjects(modelResource, inverse);\r
- if (equipment.size() != 1)\r
- throw new RuntimeException("Cannot find component for model " + modelResource);\r
- componentResource = equipment.iterator().next();\r
- Collection<Resource> pcp = graph.getObjects(componentResource, ProcessResource.plant3Dresource.HasControlPoint);\r
- if (pcp.size() != 1)\r
- throw new RuntimeException("Cannot find control point for component " + componentResource);\r
- controlPointResource = pcp.iterator().next();\r
- }\r
- \r
- @Override\r
- public void dispose() {\r
- \r
- }\r
- \r
- @Override\r
- public void run() {\r
-\r
- }\r
- \r
- private void addControlPoint() {\r
- parent.getSession().asyncWrite(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- DirectedControlPoint dcp = DirectedControlPoint.createDefault(g);\r
- PipeControlPoint pcp = new PipeControlPoint(g,controlPointResource);\r
- pcp.addStatement(ProcessResource.plant3Dresource.HasSubPoint, dcp);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- }\r
- \r
- private Spatial getDCPMesh() {\r
- try {\r
- ObjToJme converter=new ObjToJme();\r
- String file = "data/dcp.obj";\r
- URL objFile=FileLocator.find(Activator.getDefault().getBundle(),new Path(file),null);\r
- converter.setProperty("mtllib",objFile);\r
- ByteArrayOutputStream BO=new ByteArrayOutputStream();\r
- //System.out.println("Starting to convert .obj to .jme");\r
- converter.convert(objFile.openStream(),BO);\r
- \r
- Savable s = BinaryImporter.getInstance().load(new ByteArrayInputStream(BO.toByteArray()));\r
- return (Spatial)s;\r
- } catch (Exception e) {\r
- ErrorLogger.defaultLogError(e);\r
- return null;\r
- }\r
- }\r
- \r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.tools;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.List;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.jface.action.IContributionItem;\r
-import org.eclipse.jface.action.IMenuManager;\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.layout.FillLayout;\r
-import org.eclipse.swt.layout.FormAttachment;\r
-import org.eclipse.swt.layout.FormData;\r
-import org.eclipse.swt.layout.FormLayout;\r
-import org.eclipse.swt.widgets.Button;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Label;\r
-import org.eclipse.swt.widgets.Text;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.proconf.g3d.actions.ContextAction;\r
-import org.simantics.proconf.g3d.base.EditorContribution;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-\r
-\r
-public class NozzleContribution implements EditorContribution {\r
- private List<ContextAction> actions = new ArrayList<ContextAction>();\r
- private ThreeDimensionalEditorBase parent;\r
- private Resource equipmentResource;\r
- private Composite sideComposite;\r
- \r
- public NozzleContribution(ThreeDimensionalEditorBase parent) {\r
- this.parent = parent;\r
- }\r
- \r
- @Override\r
- public void createControl(Composite parent) {\r
- FormLayout flayout = new FormLayout();\r
- parent.setLayout(flayout);\r
- sideComposite = new Composite(parent,SWT.BORDER);\r
- FormData data = new FormData();\r
- data.top = new FormAttachment(0, 0);\r
- data.left = new FormAttachment(0, 0);\r
- data.right = new FormAttachment(sideComposite, 0, SWT.LEFT);\r
- data.bottom = new FormAttachment(100,0);\r
- this.parent.getRenderingComposite().setLayoutData(data);\r
- sideComposite.setLayout(new FillLayout(SWT.VERTICAL));\r
- data = new FormData();\r
- data.top = new FormAttachment(0, 0);\r
- data.bottom = new FormAttachment(100,0);\r
- data.right = new FormAttachment(100,0);\r
- sideComposite.setLayoutData(data);\r
- showNozzles(true);\r
- \r
- Button addButton = new Button(sideComposite,SWT.PUSH);\r
- addButton.setText("Add Nozzle");\r
- Label label = new Label(sideComposite,SWT.NONE);\r
- label.setText("Restrictions:");\r
- Button minButton = new Button(sideComposite,SWT.CHECK);\r
- minButton.setText("Min");\r
- Text minText = new Text(sideComposite,SWT.SINGLE | SWT.BORDER);\r
- Button maxButton = new Button(sideComposite,SWT.CHECK);\r
- maxButton.setText("Max");\r
- Text maxText = new Text(sideComposite,SWT.SINGLE | SWT.BORDER);\r
- minText.setToolTipText("Enter minimum number of nozzles");\r
- maxText.setToolTipText("Enter maximum number of nozzles");\r
-\r
- }\r
- \r
- @Override\r
- public void disposeControl() {\r
- sideComposite.dispose();\r
- \r
- }\r
- @Override\r
- public void fillContextMenu(Graph graph, IMenuManager manager,\r
- StructuredResourceSelection selection) {\r
-\r
- }\r
- \r
- @Override\r
- public void fillLocalPullDown(IMenuManager manager) {\r
-\r
- }\r
- \r
- @Override\r
- public void fillLocalToolBar(IToolBarManager manager) {\r
-\r
- }\r
- \r
- @Override\r
- public Collection<ContextAction> getActions() {\r
- return actions;\r
- }\r
- \r
- @Override\r
- public String getName() {\r
- return "Nozzles";\r
- }\r
- \r
- private void showNozzles(boolean show) {\r
- \r
- }\r
- \r
- @Override\r
- public void initialize(Graph graph) {\r
- Resource modelResource = parent.getInputResource();\r
- Resource inverse = graph.getInverse(ProcessResource.plant3Dresource.HasGraphics);\r
- Collection<Resource> equipment = graph.getObjects(modelResource, inverse);\r
- if (equipment.size() != 1)\r
- throw new RuntimeException("Cannot find equipment");\r
- equipmentResource = equipment.iterator().next();\r
- }\r
- \r
- @Override\r
- public void dispose() {\r
- showNozzles(false);\r
- }\r
- \r
- @Override\r
- public void run() {\r
-\r
- }\r
- \r
- \r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.tools;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.jface.action.IMenuManager;\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.eclipse.jface.dialogs.MessageDialog;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.layout.FormAttachment;\r
-import org.eclipse.swt.layout.FormData;\r
-import org.eclipse.swt.layout.FormLayout;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.layout.GridLayout;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Text;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.layer0.utils.EntityFactory;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.processeditor.Activator;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.actions.InsertComponentAction;\r
-import org.simantics.processeditor.actions.InsertEquipmentAction;\r
-import org.simantics.processeditor.actions.InsertNozzleAction;\r
-import org.simantics.processeditor.actions.ReversePipelineAction;\r
-import org.simantics.processeditor.actions.RoutePipeAction;\r
-import org.simantics.processeditor.actions.TranslateElbowAction;\r
-import org.simantics.processeditor.actions.TranslateInlineComponentAction;\r
-import org.simantics.processeditor.actions.TranslateStraightAction;\r
-import org.simantics.processeditor.common.ControlPointTools;\r
-import org.simantics.processeditor.stubs.InlineComponent;\r
-import org.simantics.processeditor.stubs.PipeControlPoint;\r
-import org.simantics.proconf.g3d.actions.ContextAction;\r
-import org.simantics.proconf.g3d.actions.FocusAction;\r
-import org.simantics.proconf.g3d.actions.RemoveAction;\r
-import org.simantics.proconf.g3d.actions.RotateAction;\r
-import org.simantics.proconf.g3d.actions.TranslateAction;\r
-import org.simantics.proconf.g3d.base.EditorContribution;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-import org.simantics.utils.ui.jface.MenuTools;\r
-\r
-import com.jme.intersection.CollisionData;\r
-import com.jme.intersection.CollisionResults;\r
-import com.jme.intersection.TriangleCollisionResults;\r
-import com.jme.scene.Geometry;\r
-import com.jme.scene.Node;\r
-import com.jme.scene.Spatial;\r
-\r
-\r
-public class PlantEditContribution implements EditorContribution {\r
- private List<ContextAction> actions = new ArrayList<ContextAction>();\r
- private ThreeDimensionalEditorBase parent;\r
- private Composite infoComposite;\r
- private Text infoText;\r
- \r
- private Action checkInterferencesAction = null;\r
- \r
- public PlantEditContribution(ThreeDimensionalEditorBase parent) {\r
- this.parent = parent;\r
- }\r
- \r
- @Override\r
- public void createControl(Composite parent) {\r
- FormLayout flayout = new FormLayout();\r
- parent.setLayout(flayout);\r
- infoComposite = new Composite(parent, SWT.BORDER);\r
- FormData data = new FormData();\r
- data.top = new FormAttachment(0, 0);\r
- data.left = new FormAttachment(0, 0);\r
- data.right = new FormAttachment(100, 0);\r
- data.bottom = new FormAttachment(infoComposite, 0, SWT.TOP);\r
- this.parent.getRenderingComposite().setLayoutData(data);\r
- data = new FormData();\r
- data.left = new FormAttachment(0, 0);\r
- data.right = new FormAttachment(100, 0);\r
- data.bottom = new FormAttachment(100, 0);\r
- data.height = 18;\r
- infoComposite.setLayoutData(data);\r
- GridLayout layout = new GridLayout(1,false);\r
- layout.marginWidth = 1;\r
- layout.marginHeight = 1;\r
- infoComposite.setLayout(layout);\r
- infoText = new Text(infoComposite, SWT.NONE);\r
- GridData gdata = new GridData();\r
- gdata.grabExcessHorizontalSpace = true;\r
- gdata.horizontalAlignment = SWT.FILL;\r
- infoText.setLayoutData(gdata);\r
- \r
- }\r
- \r
- @Override\r
- public void disposeControl() {\r
- infoComposite.dispose();\r
- \r
- }\r
- \r
- @Override\r
- public void dispose() {\r
-\r
- }\r
- \r
- \r
- \r
- @Override\r
- public void fillContextMenu(Graph graph, IMenuManager manager,\r
- StructuredResourceSelection selection) {\r
-\r
- }\r
- \r
- @Override\r
- public void fillLocalPullDown(IMenuManager manager) {\r
- MenuTools.getOrCreate(parent.getMenuID(),"Advanced", manager).add(checkInterferencesAction);\r
- \r
- }\r
- \r
- @Override\r
- public void fillLocalToolBar(IToolBarManager manager) {\r
-\r
- }\r
- \r
- @Override\r
- public Collection<ContextAction> getActions() {\r
- return actions;\r
- }\r
- \r
- @Override\r
- public String getName() {\r
- return "Plant Editing";\r
- }\r
- \r
- @Override\r
- public void initialize(Graph graph) {\r
- actions.add(new TranslateAction(parent){\r
- @Override\r
- public boolean usable(Graph graph,List<Resource> resources) {\r
- if (super.usable(graph, resources)) {\r
- for (Resource r : resources) {\r
- // FIXME : use new ontology :\r
- // 1. lose ends works like end components (just what this code does, but type checks are not correct)\r
- // 2. connected components are moved inline. (TranslateInlineAction)\r
- IEntity t = EntityFactory.create(graph, r);\r
- if (t.isInstanceOf(ProcessResource.plant3Dresource.InlineComponent)) {\r
- InlineComponent component = new InlineComponent(t);\r
- PipeControlPoint pcp = component.getControlPoint();\r
- if (pcp.getNext() != null && pcp.getPrevious() != null)\r
- return false;\r
- }\r
- }\r
- return true;\r
- }\r
- return false;\r
- }\r
- \r
- @Override\r
- public void setInfoText(String text) {\r
- infoText.setText(text);\r
- }\r
- });\r
- actions.add(new TranslateInlineComponentAction(parent) {\r
- @Override\r
- public void setInfoText(String text) {\r
- infoText.setText(text);\r
- }\r
- });\r
- actions.add(new TranslateStraightAction(parent) {\r
- @Override\r
- public void setInfoText(String text) {\r
- infoText.setText(text);\r
- }\r
- });\r
- actions.add(new TranslateElbowAction(parent) {\r
- @Override\r
- public void setInfoText(String text) {\r
- infoText.setText(text);\r
- }\r
- });\r
- actions.add(new RotateAction(parent){\r
- @Override\r
- public boolean usable(Graph graph,List<Resource> resources) {\r
- if (super.usable(graph,resources)) {\r
- for (Resource r : resources) {\r
- IEntity t = EntityFactory.create(graph,r);\r
- // FIXME : use new ontology\r
- // TODO : create rotate action that can rotate inline components\r
- // TODO : ontology change: pipes and similar components cannot be rotated, since there is no point to do that.\r
- if (t.isInstanceOf(ProcessResource.plant3Dresource.InlineComponent)) {\r
- return false;\r
- }\r
- }\r
- return true;\r
- }\r
- \r
- return false;\r
- }\r
- \r
- @Override\r
- public void setInfoText(String text) {\r
- infoText.setText(text);\r
- }\r
- });\r
- actions.add(new RemoveAction(parent) {\r
- @Override\r
- public GraphRequestStatus doChanges(Graph graph) {\r
- Iterator<Resource> i = parent.getSelectionAdapter().getCurrentSelection().iterator();\r
- while (i.hasNext()) {\r
- Resource s = i.next();\r
- IEntity r = EntityFactory.create(graph, s);\r
- if (r.isInstanceOf(ProcessResource.g3dResource.G3DNode)) {\r
- Collection<IEntity> parentNode= r.getRelatedObjects(ProcessResource.g3dResource.HasParent);\r
- if (parentNode.size() == 1) {\r
- Collection<IEntity> rs = r.getRelatedObjects(ProcessResource.plant3Dresource.HasControlPoint);\r
- for (IEntity cp : rs) {\r
- ControlPointTools.removeControlPoint(new PipeControlPoint(cp));\r
- }\r
- r.removeRelatedStatements(ProcessResource.g3dResource.HasParent);\r
- } else {\r
- if (parentNode.size() == 0) {\r
- parent.showMessage("Object has no parent, don't know what to do!");\r
- } else {\r
- parent.showMessage("Object has more than one parent, don't know what to do!");\r
- }\r
- }\r
- }\r
-\r
- }\r
- //parent.getSelectionAdapter().setSelection(new StructuredResourceSelection());\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- actions.add(new FocusAction(parent));\r
- actions.add(new RoutePipeAction(parent){\r
- @Override\r
- public void setInfoText(String text) {\r
- infoText.setText(text);\r
- }\r
- }); \r
- actions.add(new InsertComponentAction(parent));\r
- actions.add(new InsertEquipmentAction(parent));\r
- actions.add(new InsertNozzleAction(parent));\r
- actions.add(new ReversePipelineAction(parent));\r
- \r
- checkInterferencesAction = new Action() {\r
- public void run() {\r
- CollisionResults results = new TriangleCollisionResults();\r
- //getRenderingComponent().getNormalRoot().calculateCollisions(getRenderingComponent().getNormalRoot(), results);\r
- collide(parent.getRenderingComponent().getShadowRoot(),parent.getRenderingComponent().getShadowRoot(),results);\r
- results = filterResults(results);\r
- for (int i = 0; i < results.getNumber(); i++) {\r
- CollisionData data = results.getCollisionData(i);\r
- Geometry s = data.getSourceMesh();\r
- Geometry t = data.getTargetMesh();\r
- MessageDialog dialog = new MessageDialog(parent.getRenderingComposite().getShell(),"Interference " + i + " / " + results.getNumber(), null, "Interference between " + s + " and " + t,MessageDialog.WARNING,new String[]{"Next","Cancel"},0);\r
- try {\r
- Resource sid = parent.getScenegraphAdapter().getNodeResource(s.getName());\r
- Resource tid = parent.getScenegraphAdapter().getNodeResource(t.getName());\r
-\r
- StructuredResourceSelection sel = new StructuredResourceSelection();\r
- if (sid == tid) {\r
- sel.add(sid);\r
- } else {\r
- sel.add(sid);\r
- sel.add(tid);\r
- }\r
- parent.getSelectionAdapter().setSelection(sel);\r
- } catch(NumberFormatException e) {\r
- \r
- }\r
- if (dialog.open() == 1)\r
- break;\r
- }\r
- }\r
- \r
- private void collide(Spatial s, Spatial p, CollisionResults r) {\r
- s.calculateCollisions(p, r);\r
- if (s instanceof Node) {\r
- Node n = (Node)s;\r
- for (Spatial t : n.getChildren())\r
- collide(t,p,r);\r
- }\r
- }\r
- \r
- private CollisionResults filterResults(CollisionResults results) {\r
- CollisionResults r = new TriangleCollisionResults();\r
- for (int i = 0; i < results.getNumber(); i++) {\r
- CollisionData d = results.getCollisionData(i);\r
- if (d.getSourceMesh() == d.getTargetMesh())\r
- continue;\r
- boolean found = false;\r
- for (int j = 0; j < r.getNumber(); j++) {\r
- CollisionData d2 = r.getCollisionData(j);\r
- if (d2.getSourceMesh() == d.getSourceMesh() &&\r
- d2.getTargetMesh() == d.getTargetMesh()) {\r
- found = true;\r
- break;\r
- }\r
- if (d2.getSourceMesh() == d.getTargetMesh() &&\r
- d2.getTargetMesh() == d.getSourceMesh()) {\r
- found = true;\r
- break;\r
- } \r
- }\r
- if (!found) {\r
- if (d.getSourceTris().size() == 0)\r
- continue;\r
- if (d.getTargetTris().size() == 0)\r
- continue;\r
- r.addCollisionData(d);\r
- }\r
- }\r
- return r;\r
- }\r
-\r
- };\r
- checkInterferencesAction.setText("Interferences");\r
- checkInterferencesAction.setImageDescriptor(Activator.imageDescriptorFromPlugin("fi.vtt.proconf.ode", "icons/silk/delete.png"));\r
- \r
- }\r
- \r
- @Override\r
- public void run() {\r
- \r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.tools;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.List;\r
-import java.util.Stack;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.jface.action.IMenuManager;\r
-import org.eclipse.jface.action.IToolBarManager;\r
-import org.eclipse.swt.layout.FillLayout;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.GraphRequestAdapter;\r
-import org.simantics.db.GraphRequestStatus;\r
-import org.simantics.db.Resource;\r
-import org.simantics.processeditor.Activator;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.animations.PipeAnimationController;\r
-import org.simantics.processeditor.dialogs.ConfigureAnimationDialog;\r
-import org.simantics.processeditor.dialogs.ConfigureMonitorDialog;\r
-import org.simantics.processeditor.dialogs.ConfigurePipelineAnimationDialog;\r
-import org.simantics.processeditor.monitors.Monitor;\r
-import org.simantics.processeditor.monitors.ResourcePathPropertyProvider;\r
-import org.simantics.processeditor.monitors.TextMonitor;\r
-import org.simantics.processeditor.stubs.PipeRun;\r
-import org.simantics.proconf.g3d.actions.ContextAction;\r
-import org.simantics.proconf.g3d.actions.FocusAction;\r
-import org.simantics.proconf.g3d.animation.Animatable;\r
-import org.simantics.proconf.g3d.animation.AnimationController;\r
-import org.simantics.proconf.g3d.animation.AnimationSystem;\r
-import org.simantics.proconf.g3d.animation.TestAnimationController;\r
-import org.simantics.proconf.g3d.animation.ui.AnimationControlCreator;\r
-import org.simantics.proconf.g3d.base.EditorContribution;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-import org.simantics.proconf.g3d.scenegraph.IGraphicsNode;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-import org.simantics.utils.ui.jface.MenuTools;\r
-\r
-/**\r
- * Plant Visualization Contribution\r
- * \r
- * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
- *\r
- */\r
-public class PlantVisualizationContribution implements EditorContribution {\r
- private List<ContextAction> actions = new ArrayList<ContextAction>();\r
- private ThreeDimensionalEditorBase parent;\r
- \r
- private AnimationSystem animationSystem = null;\r
- private Action animatePipesAction = null;\r
- private Action animateAction = null;\r
- private Action showMonitorsAction = null;\r
- private Action configureAnimationAction = null;\r
- private Action configurePipelineAnimationAction = null;\r
- private Action configureMonitorAction = null;\r
- \r
- private Monitor monitor;\r
- \r
- public PlantVisualizationContribution(ThreeDimensionalEditorBase parent) {\r
- this.parent = parent;\r
- }\r
- \r
- @Override\r
- public void createControl(Composite parent) {\r
- parent.setLayout(new FillLayout());\r
- this.parent.getRenderingComposite().setLayoutData(null);\r
- }\r
- \r
- @Override\r
- public void disposeControl() {\r
- \r
- }\r
- \r
- @Override\r
- public void dispose() {\r
- \r
- }\r
- \r
- @Override\r
- public void fillContextMenu(Graph graph, IMenuManager manager,\r
- StructuredResourceSelection selection) {\r
- \r
- }\r
- \r
- @Override\r
- public void fillLocalPullDown(IMenuManager menuManager) {\r
- MenuTools.getOrCreate(parent.getMenuID(),"Monitors", menuManager).add(showMonitorsAction);\r
- MenuTools.getOrCreate(parent.getMenuID(),"Monitors", menuManager).add(configureMonitorAction);\r
- IMenuManager animationMenu = MenuTools.getOrCreate(parent.getMenuID(),"Animations",menuManager);\r
- animationMenu.add(configureAnimationAction);\r
- animationMenu.add(configurePipelineAnimationAction);\r
- MenuTools.getOrCreate(parent.getMenuID(),"Test", animationMenu).add(animateAction);\r
- MenuTools.getOrCreate(parent.getMenuID(),"Test", animationMenu).add(animatePipesAction);\r
- \r
- }\r
- \r
-// @Override\r
-// public void fillMainMenu(List<IContributionItem> list) {\r
-// MenuTools.getOrCreate("Monitors", list).add(showMonitorsAction);\r
-// MenuTools.getOrCreate("Monitors", list).add(configureMonitorAction);\r
-// IMenuManager animationMenu = MenuTools.getOrCreate("Animations",list);\r
-// animationMenu.add(configureAnimationAction);\r
-// animationMenu.add(configurePipelineAnimationAction);\r
-// MenuTools.getOrCreate("Test", animationMenu).add(animateAction);\r
-// MenuTools.getOrCreate("Test", animationMenu).add(animatePipesAction);\r
-// \r
-// }\r
- \r
- @Override\r
- public void fillLocalToolBar(IToolBarManager manager) {\r
- AnimationControlCreator c = new AnimationControlCreator(getAnimationSystem());\r
- manager.add(c.createStopAction());\r
- manager.add(c.createPauseAction());\r
- manager.add(c.createPlayAction());\r
- manager.add(showMonitorsAction);\r
- }\r
- \r
- @Override\r
- public Collection<ContextAction> getActions() {\r
- return actions;\r
- }\r
- \r
- @Override\r
- public String getName() {\r
- return "Plant Visualization";\r
- }\r
- \r
- @Override\r
- public void run() {\r
- parent.getSession().syncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- getAnimationSystem().run(g,0.01);\r
- updateMonitor(g);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- \r
- }\r
- \r
- private G3DNode getRoot(Graph g) {\r
- return new G3DNode(g,parent.getScenegraphAdapter().getRootResource());\r
- }\r
- \r
- @Override\r
- public void initialize(Graph graph) {\r
- animateAction = new Action("", Action.AS_CHECK_BOX) {\r
- public void run() {\r
- if (this.isChecked()) {\r
- parent.getSession().asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g)\r
- throws Exception {\r
- AnimationController c = new TestAnimationController();\r
- Collection<IGraphicsNode> nodes = parent.getScenegraphAdapter().getNodes();\r
- for (IGraphicsNode node : nodes) {\r
- if (node instanceof Animatable) {\r
- Animatable a = (Animatable) node;\r
- if (a.setRandomAnimation(g))\r
- c.addAnimatable(a);\r
- }\r
- }\r
- animationSystem.add(c);\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
-// showMessage("Activated " + animatables.size()\r
-// + " animations");\r
- } else {\r
- animationSystem.stop();\r
- }\r
- }\r
- };\r
- \r
- animateAction.setText("Random animations");\r
- \r
- animatePipesAction = new AnimatePipesAction("Pipe animations");\r
- \r
- showMonitorsAction = new Action("Interactive Monitor", Action.AS_CHECK_BOX) {\r
- public void run() {\r
- showMonitors(this.isChecked());\r
- }\r
- };\r
- showMonitorsAction.setImageDescriptor(Activator.imageDescriptorFromPlugin("fi.vtt.proconf.ode", "icons/silk/monitor.png"));\r
- \r
- \r
- \r
- configureAnimationAction = new Action() {\r
- \r
- public void run() {\r
- parent.getSession().syncRead(new GraphRequestAdapter(){\r
- List <Resource> list = new ArrayList<Resource>();\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- Stack<G3DNode> stack = new Stack<G3DNode>();\r
- stack.add(getRoot(g));\r
- while (!stack.isEmpty()) {\r
- G3DNode n = stack.pop();\r
- list.add(n.getResource());\r
- for (G3DNode no : n.getChild())\r
- stack.push(no);\r
- }\r
- \r
- if (list.size() == 0)\r
- return GraphRequestStatus.transactionComplete();\r
- \r
- ConfigureAnimationDialog dialog = new ConfigureAnimationDialog(parent.getRenderingComposite().getShell(),parent.getSession(),list,parent.getScenegraphAdapter(),getAnimationSystem());\r
- dialog.open();\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- });\r
-\r
- }\r
- \r
- \r
- };\r
- configureAnimationAction.setText("Configure animations");\r
- configureAnimationAction.setImageDescriptor(Activator.imageDescriptorFromPlugin("fi.vtt.proconf.ode", "icons/silk/film_edit.png"));\r
- \r
- configurePipelineAnimationAction = new Action() {\r
- \r
- public void run() {\r
- parent.getSession().syncRead(new GraphRequestAdapter(){\r
- List <Resource> list = new ArrayList<Resource>();\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- Stack<G3DNode> stack = new Stack<G3DNode>();\r
- stack.add(getRoot(g));\r
- while (!stack.isEmpty()) {\r
- G3DNode n = stack.pop();\r
- if (n.isInstanceOf(ProcessResource.plant3Dresource.PipeRun))\r
- list.add(n.getResource());\r
- else //piperun will not contain other piperuns\r
- for (G3DNode no : n.getChild())\r
- stack.push(no);\r
- }\r
- \r
- if (list.size() == 0)\r
- return GraphRequestStatus.transactionComplete();\r
- \r
- ConfigurePipelineAnimationDialog dialog = new ConfigurePipelineAnimationDialog(parent.getRenderingComposite().getShell(),parent.getSession(),list,parent.getRenderingComponent(),getAnimationSystem());\r
- dialog.open();\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- });\r
- \r
- }\r
- \r
- \r
- };\r
- configurePipelineAnimationAction.setText("Configure pipeline animations");\r
- configurePipelineAnimationAction.setImageDescriptor(Activator.imageDescriptorFromPlugin("fi.vtt.proconf.ode", "icons/silk/film_edit.png"));\r
- configureMonitorAction = new Action() {\r
- \r
- public void run() {\r
- parent.getSession().syncRead(new GraphRequestAdapter(){\r
- List <Resource> list = new ArrayList<Resource>();\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- Stack<G3DNode> stack = new Stack<G3DNode>();\r
- stack.add(getRoot(g));\r
- while (!stack.isEmpty()) {\r
- G3DNode n = stack.pop();\r
- list.add(n.getResource());\r
- for (G3DNode no : n.getChild())\r
- stack.push(no);\r
- }\r
- \r
- if (list.size() == 0)\r
- return GraphRequestStatus.transactionComplete();\r
- \r
- ConfigureMonitorDialog dialog = new ConfigureMonitorDialog(parent.getRenderingComposite().getShell(),parent.getSession(),list);\r
- dialog.open();\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- \r
- });\r
- \r
- }\r
- };\r
- configureMonitorAction.setText("Configure monitor");\r
- configureMonitorAction.setImageDescriptor(Activator.imageDescriptorFromPlugin("fi.vtt.proconf.ode", "icons/silk/monitor_edit.png"));\r
- \r
- actions.add(new FocusAction(parent));\r
- }\r
- \r
- private AnimationSystem getAnimationSystem() {\r
- if (animationSystem == null) {\r
- animationSystem = new AnimationSystem(parent.getScenegraphAdapter());\r
- }\r
- return animationSystem;\r
- }\r
- \r
- protected void updateMonitor(Graph graph) {\r
- if (showMonitorsAction.isChecked()) {\r
- \r
- List<IGraphicsNode> nodes = parent.getSelectionAdapter().getInteractiveSelectedObjects();\r
- if (nodes.size() > 0) {\r
- IGraphicsNode selected = nodes.get(0);\r
- if (monitor.acceptNode(graph,selected))\r
- monitor.setNode(graph,selected);\r
- }\r
- monitor.update();\r
- }\r
- }\r
- \r
- protected Monitor createMonitor() {\r
- Monitor m = new TextMonitor(parent);\r
- m.setTextProvider(new ResourcePathPropertyProvider());\r
- return m;\r
- }\r
- \r
- private void showMonitors(boolean show) {\r
- if (show) {\r
- if (monitor == null) {\r
- monitor = createMonitor();\r
- }\r
- final List <IGraphicsNode> nodes = parent.getSelectionAdapter().getInteractiveSelectedObjects();\r
- if (nodes.size() > 0) {\r
- parent.getSession().asyncRead(new GraphRequestAdapter() {\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- monitor.setNode(g,nodes.get(0));\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
- });\r
- \r
- }\r
- \r
- } else if (!show && monitor != null) {\r
- monitor.remove();\r
- parent.setViewChanged(true);\r
- }\r
- }\r
- \r
- private class AnimatePipesAction extends Action {\r
-\r
- public AnimatePipesAction(String text) {\r
- super(text, Action.AS_CHECK_BOX);\r
-\r
- }\r
-\r
- public void run() {\r
- if (this.isChecked()) {\r
- parent.getSession().syncRead(new GraphRequestAdapter() {\r
- List<PipeRun> list = new ArrayList<PipeRun>();\r
-\r
- @Override\r
- public GraphRequestStatus perform(Graph g) throws Exception {\r
- Stack<G3DNode> stack = new Stack<G3DNode>();\r
- stack.add(getRoot(g));\r
- while (!stack.isEmpty()) {\r
- G3DNode n = stack.pop();\r
- if (n.isInstanceOf(ProcessResource.plant3Dresource.PipeRun))\r
- list.add(new PipeRun(n));\r
- else\r
- //piperun will not contain other piperuns\r
- for (G3DNode no : n.getChild())\r
- stack.push(no);\r
- }\r
-\r
- for (PipeRun n : list) {\r
- PipeAnimationController c = new PipeAnimationController(parent.getRenderingComponent(), n);\r
- //animationSystem.add(c);\r
- getAnimationSystem().add(c);\r
- }\r
- return GraphRequestStatus.transactionComplete();\r
- }\r
-\r
- });\r
-\r
- } else {\r
- //stopAnimations();\r
- getAnimationSystem().stop();\r
- }\r
- }\r
-\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.views;\r
-\r
-import java.util.Collection;\r
-\r
-import org.eclipse.swt.widgets.Display;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.management.ISessionContext;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.tools.NozzleContribution;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorPart;\r
-import org.simantics.proconf.g3d.shapeeditor.views.ShapeEditorBase;\r
-\r
-\r
-public class EquipmentEditorPart extends ThreeDimensionalEditorPart {\r
- \r
- @Override\r
- protected ThreeDimensionalEditorBase createEditor(ISessionContext session) {\r
- ShapeEditorBase base = new ShapeEditorBase(session);\r
- base.addEditorContribution(new NozzleContribution(base));\r
- return base;\r
- }\r
- \r
- @Override\r
- public void reload(Graph g) {\r
- Resource inputResource = getInputResource();\r
- Collection<Resource> model = g.getObjects(inputResource, ProcessResource.plant3Dresource.HasGraphics);\r
- if (model.size() != 1)\r
- throw new RuntimeException("Cannot find model for equipment " + inputResource);\r
- Resource modelResource = model.iterator().next();\r
- if (modelResource != null) {\r
- editor.reload(g,modelResource);\r
- } else {\r
- \r
- Display d = getSite().getShell().getDisplay();\r
- d.asyncExec(new Runnable() {\r
- public void run() {\r
- editor.showMessage("Failed to load model.");\r
- getSite().getPage().closeEditor(EquipmentEditorPart.this,false);\r
- }\r
- });\r
- }\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.views;\r
-\r
-import java.util.Collection;\r
-\r
-import org.eclipse.swt.widgets.Display;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.management.ISessionContext;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.tools.ControlPointContribution;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorPart;\r
-import org.simantics.proconf.g3d.shapeeditor.views.ShapeEditorBase;\r
-\r
-\r
-public class PipelineComponentEditorPart extends ThreeDimensionalEditorPart {\r
- \r
- @Override\r
- protected ThreeDimensionalEditorBase createEditor(ISessionContext session) {\r
- ShapeEditorBase base = new ShapeEditorBase(session);\r
- base.addEditorContribution(new ControlPointContribution(base));\r
- return base;\r
- }\r
- \r
- @Override\r
- public void reload(Graph g) {\r
- Resource inputResource = getInputResource();\r
- Collection<Resource> model = g.getObjects(inputResource, ProcessResource.plant3Dresource.HasGraphics);\r
- if (model.size() != 1)\r
- throw new RuntimeException("Cannot find model for pipeline component " + inputResource);\r
- Resource modelResource = model.iterator().next();\r
- if (modelResource != null) {\r
- editor.reload(g,modelResource);\r
- } else {\r
- \r
- Display d = getSite().getShell().getDisplay();\r
- d.asyncExec(new Runnable() {\r
- public void run() {\r
- editor.showMessage("Failed to load model.");\r
- getSite().getPage().closeEditor(PipelineComponentEditorPart.this,false);\r
- }\r
- });\r
- }\r
- }\r
-\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.views;\r
-\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.management.ISessionContext;\r
-import org.simantics.layer0.utils.viewpoints.ResourceViewpoint;\r
-import org.simantics.processeditor.perspectives.ViewpointGenerator;\r
-import org.simantics.proconf.browsing.views.GraphExplorerOutlinePage;\r
-\r
-\r
-public class PlantStructureOutlinePage extends GraphExplorerOutlinePage {\r
-\r
- \r
- public PlantStructureOutlinePage(ISessionContext sessionContext, Resource inputResource) {\r
- super(sessionContext, inputResource);\r
- }\r
- \r
- @Override\r
- public void createControl(Composite parent) {\r
- super.createControl(parent);\r
- }\r
-\r
- @Override\r
- public ResourceViewpoint getViewPoint(ISessionContext sessionContext) {\r
- return ViewpointGenerator.createObjectStructureViewpoint();\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.views;\r
-\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.simantics.db.management.ISessionContext;\r
-import org.simantics.layer0.utils.viewpoints.ResourceViewpoint;\r
-import org.simantics.processeditor.perspectives.ViewpointGenerator;\r
-import org.simantics.proconf.browsing.GraphExplorer;\r
-import org.simantics.proconf.browsing.views.GraphExplorerView;\r
-\r
-\r
-public class PlantStructureView extends GraphExplorerView {\r
-\r
- @Override\r
- protected GraphExplorer createExplorer(Composite parent) {\r
- return super.createExplorer(parent);\r
- }\r
- \r
- @Override\r
- protected ResourceViewpoint getViewpoint(ISessionContext context) {\r
- return ViewpointGenerator.createViewpoint();\r
- }\r
-}\r
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.views;\r
-\r
-import org.eclipse.jface.viewers.ISelection;\r
-import org.eclipse.jface.viewers.ISelectionChangedListener;\r
-import org.eclipse.jface.viewers.SelectionChangedEvent;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.ui.IWorkbenchPart;\r
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;\r
-import org.simantics.db.Graph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.management.ISessionContext;\r
-import org.simantics.layer0.utils.IEntity;\r
-import org.simantics.processeditor.ProcessResource;\r
-import org.simantics.processeditor.actions.ConfigureFloorAction;\r
-import org.simantics.processeditor.actions.InsertComponentAction;\r
-import org.simantics.processeditor.actions.InsertEquipmentAction;\r
-import org.simantics.processeditor.actions.InsertNozzleAction;\r
-import org.simantics.processeditor.actions.RoutePipeAction;\r
-import org.simantics.processeditor.adapters.ProcessEditorAdapter;\r
-import org.simantics.processeditor.adapters.ProcessEditorSelectionAdapter;\r
-import org.simantics.processeditor.common.ControlPointTools;\r
-import org.simantics.processeditor.stubs.Plant;\r
-import org.simantics.processeditor.tools.PlantEditContribution;\r
-import org.simantics.processeditor.tools.PlantVisualizationContribution;\r
-import org.simantics.proconf.g3d.base.JmeRenderingComponent;\r
-import org.simantics.proconf.g3d.base.ScenegraphAdapter;\r
-import org.simantics.proconf.g3d.base.SelectionAdapter;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.common.StructuredResourceSelection;\r
-import org.simantics.proconf.g3d.shapes.FloorShape;\r
-import org.simantics.proconf.g3d.stubs.G3DNode;\r
-import org.simantics.utils.ui.jface.MenuTools;\r
-\r
-import com.jme.math.Vector3f;\r
-import com.jme.scene.Geometry;\r
-\r
-\r
-public class ProcessEditor extends ThreeDimensionalEditorBase {\r
- \r
- private Resource plantResource = null;\r
- \r
- private ConfigureFloorAction configureFloorAction = null;\r
-\r
- private Geometry floorShape = null;\r
-\r
- public ProcessEditor(ISessionContext session) {\r
- super(session);\r
- addEditorContribution(new PlantEditContribution(this));\r
- addEditorContribution(new PlantVisualizationContribution(this));\r
- }\r
- \r
- public ProcessEditor(ISessionContext session,JmeRenderingComponent component) {\r
- super(session,component);\r
- addEditorContribution(new PlantEditContribution(this));\r
- addEditorContribution(new PlantVisualizationContribution(this));\r
- }\r
- \r
- @Override\r
- protected ScenegraphAdapter createScenegraphAdapter() {\r
- return new ProcessEditorAdapter(this,session,getRenderingComponent());\r
- }\r
- \r
- @Override\r
- public void createControl(Graph graph,Composite parent) {\r
- super.createControl(graph,parent);\r
-\r
- floorShape = FloorShape.getShape(getRenderingComponent().getDisplaySystem().getRenderer(), 100.f,0.2f);\r
- getRenderingComponent().getNoCastRoot().attachChild(floorShape);\r
- floorShape.setLocalTranslation(new Vector3f(0.f,-0.01f,0.f));\r
- configureFloorAction.setFloorShape(floorShape);\r
- }\r
-\r
- @Override\r
- protected void makeActions(Graph graph) {\r
- super.makeActions(graph);\r
-\r
- //actions.add(new ShowTrendsAction(this));\r
-\r
- configureFloorAction = new ConfigureFloorAction(this);\r
-\r
-// ContextActionFactory extended[] = ContextActionRegistry.getActions("fi.vtt.proconf.shapeeditor.processeditorview");\r
-// for (ContextActionFactory c : extended) {\r
-// actions.add(c.createAction(this));\r
-// }\r
- }\r
- \r
- protected void fillLocalPullDown() {\r
- super.fillLocalPullDown();\r
- MenuTools.getOrCreate(getMenuID(),"Advanced", menuManager).add(configureFloorAction);\r
- }\r
- \r
-\r
- @Override\r
- protected void pageSelectionChanged(IWorkbenchPart part, ISelection selection) {\r
- StructuredResourceSelection s = SelectionAdapter.transformSelection(selection);\r
-\r
- selectionAdapter.setCurrentSelection(s);\r
- viewChanged = true;\r
-\r
- /*\r
- if (part instanceof ProcessEditor) {\r
- ProcessEditor sender = (ProcessEditor)part;\r
- if (!sender.getPlantResource().equals(plantResource)) {\r
- selectionAdapter.setCurrentSelection(new StructuredResourceSelection());\r
- selectionAdapter.setEditorSelection();\r
- return;\r
- }\r
- } \r
- */\r
- \r
- selectionAdapter.setEditorSelection();\r
- \r
- }\r
-\r
- @Override\r
- protected void reloadFrom(IEntity thing) {\r
- if (plantResource != null) {\r
- throw new UnsupportedOperationException("Reloading instantiated viewer not supported");\r
- }\r
- if (thing.isInstanceOf(ProcessResource.plant3Dresource.Plant)) {\r
- plantResource = thing.getResource();\r
- G3DNode plant = new G3DNode(thing);\r
- adapter.setRootNode(plant);\r
- //adapter.addOutbound(plant);\r
- ControlPointTools.reloadCache(thing.getGraph(),plant.getResource());\r
- } else {\r
- throw new IllegalArgumentException("Resource is not a plant");\r
- } \r
- }\r
-\r
- public Resource getPlantResource() {\r
- return plantResource;\r
- }\r
- \r
- public Plant getPlant(Graph g) {\r
- return new Plant(g, plantResource);\r
- }\r
- \r
- @Override\r
- protected SelectionAdapter createSelectionAdapter() {\r
- return new ProcessEditorSelectionAdapter(adapter);\r
- }\r
-\r
- @Override\r
- protected void hookDragAndDrop() {\r
- super.hookDragAndDrop();\r
- dropTarget.addDropListener(new InsertEquipmentAction(this));\r
- dropTarget.addDropListener(new InsertNozzleAction(this));\r
- dropTarget.addDropListener(new InsertComponentAction(this));\r
- dropTarget.addDropListener(new RoutePipeAction(this));\r
- }\r
- \r
- @Override\r
- public Object getAdapter(Class adapter) {\r
- if (adapter == IContentOutlinePage.class) {\r
- if (getPlantResource() == null)\r
- return null;\r
- final PlantStructureOutlinePage page = new PlantStructureOutlinePage(sessionContext,getPlantResource());\r
- \r
- getSelectionAdapter().addSelectionChangedListener(new ISelectionChangedListener() {\r
- @Override\r
- public void selectionChanged(SelectionChangedEvent event) {\r
- page.setSelection(event.getSelection());\r
- \r
- }\r
- });\r
- parent.getDisplay().asyncExec(new Runnable() {\r
- @Override\r
- public void run() {\r
- page.addSelectionChangedListener(new ISelectionChangedListener() {\r
- @Override\r
- public void selectionChanged(SelectionChangedEvent event) {\r
- selectionAdapter.setSelection(SelectionAdapter.transformSelection(event.getSelection()));\r
- }\r
- });\r
- }\r
- });\r
-\r
- return page;\r
- }\r
- return null;\r
- }\r
-}
\ No newline at end of file
+++ /dev/null
-/*******************************************************************************\r
- * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.processeditor.views;\r
-\r
-import org.simantics.db.management.ISessionContext;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorBase;\r
-import org.simantics.proconf.g3d.base.ThreeDimensionalEditorPart;\r
-\r
-\r
-public class ProcessEditorPart extends ThreeDimensionalEditorPart {\r
- \r
- @Override\r
- protected ThreeDimensionalEditorBase createEditor(ISessionContext session) {\r
- return new ProcessEditor(session);\r
- }\r
-\r
-}\r