diff --git a/OpenMEP/Element/MEPCurve.cs b/OpenMEP/Element/MEPCurve.cs index 3242d027..03135b07 100644 --- a/OpenMEP/Element/MEPCurve.cs +++ b/OpenMEP/Element/MEPCurve.cs @@ -1,14 +1,17 @@ using System.Collections; +using System.Runtime.CompilerServices; using Autodesk.DesignScript.Runtime; using Autodesk.Revit.DB; using Autodesk.Revit.DB.Mechanical; using Autodesk.Revit.DB.Plumbing; using Dynamo.Graph.Nodes; +using GShark.Geometry; using OpenMEP.Helpers; using Revit.GeometryConversion; using RevitServices.Transactions; using Curve = Autodesk.DesignScript.Geometry.Curve; using Line = Autodesk.Revit.DB.Line; +using Point = OpenMEPSandbox.Geometry.Point; namespace OpenMEP.Element; @@ -42,6 +45,7 @@ private MEPCurve() return mCurve.Document.GetElement(id).ToDynamoType(); } } + TransactionManager.Instance.TransactionTaskDone(); return null; } @@ -54,12 +58,13 @@ private MEPCurve() /// private static ElementId BreakCurve(Autodesk.Revit.DB.MEPCurve? mepCurve, XYZ? ptBreak) { - if(mepCurve==null) throw new ArgumentNullException(nameof(mepCurve)); - if(ptBreak==null) throw new ArgumentNullException(nameof(ptBreak)); + if (mepCurve == null) throw new ArgumentNullException(nameof(mepCurve)); + if (ptBreak == null) throw new ArgumentNullException(nameof(ptBreak)); if (mepCurve is Autodesk.Revit.DB.Plumbing.Pipe || mepCurve is Autodesk.Revit.DB.Plumbing.FlexPipe) { return PlumbingUtils.BreakCurve(mepCurve.Document, mepCurve.Id, ptBreak); } + if (mepCurve is Autodesk.Revit.DB.Mechanical.Duct || mepCurve is Autodesk.Revit.DB.Mechanical.FlexDuct) { return MechanicalUtils.BreakCurve(mepCurve.Document, mepCurve.Id, ptBreak); @@ -70,6 +75,7 @@ private static ElementId BreakCurve(Autodesk.Revit.DB.MEPCurve? mepCurve, XYZ? p ElementId elementId = BreakConduitCableTray(mepCurve.Document, mepCurve.Id, ptBreak); return elementId; } + return ElementId.InvalidElementId; } @@ -223,6 +229,8 @@ private static void AdjustMepCurve(Autodesk.Revit.DB.Element mepCurve, XYZ p1, X return newTeeFitting.ToDynamoType(); } + + /// /// Add a new family instance of an transition fitting into the Autodesk Revit document, /// using two connectors. @@ -431,11 +439,11 @@ private static void AdjustMepCurve(Autodesk.Revit.DB.Element mepCurve, XYZ p1, X /// [MultiReturn("Percent", "Degrees", "Ratio")] [NodeCategory("Query")] - public static Dictionary Slope(Revit.Elements.Element mepCurve,double digit =0) + public static Dictionary Slope(Revit.Elements.Element mepCurve, double digit = 0) { - if(mepCurve==null) throw new ArgumentNullException(nameof(mepCurve)); + if (mepCurve == null) throw new ArgumentNullException(nameof(mepCurve)); Autodesk.Revit.DB.MEPCurve? internalElement = mepCurve.InternalElement as Autodesk.Revit.DB.MEPCurve; LocationCurve? locationCurve = internalElement!.Location as LocationCurve; - return OpenMEPSandbox.Geometry.Line.Slope(locationCurve?.Curve.ToDynamoType(), digit); + return OpenMEPSandbox.Geometry.Line.Slope(locationCurve?.Curve.ToDynamoType(), digit); } } \ No newline at end of file diff --git a/OpenMEPSandbox/Geometry/Point.cs b/OpenMEPSandbox/Geometry/Point.cs index fdcb53cd..a9ea207c 100644 --- a/OpenMEPSandbox/Geometry/Point.cs +++ b/OpenMEPSandbox/Geometry/Point.cs @@ -32,6 +32,27 @@ public static Autodesk.DesignScript.Geometry.Point ProjectOntoPlane( return Autodesk.DesignScript.Geometry.Point.ByCoordinates(projectedPoint.X, projectedPoint.Y, projectedPoint.Z); } + /// + /// Project a point onto a line + /// + /// Point need to project + /// Line to project the point + /// projected point + /// + /// ![](../OpenMEPPage/geometry/dyn/pic/Point.ProjectOnToLine.gif) + /// + public static Autodesk.DesignScript.Geometry.Point ProjectOnToLine(Autodesk.DesignScript.Geometry.Point point, + Autodesk.DesignScript.Geometry.Line line) + { + Autodesk.DesignScript.Geometry.Vector lineDirection = line.Direction.Normalized(); + Autodesk.DesignScript.Geometry.Point start = line.StartPoint; + Autodesk.DesignScript.Geometry.Vector vector = point.AsVector().Subtract(start.AsVector()); + double projectionLength = lineDirection.Dot(vector); + var ProjectedPoint = start.Add(lineDirection.Scale(projectionLength)); + return ProjectedPoint; + } + + /// /// Get the centroid of a list of points /// @@ -99,9 +120,10 @@ public static bool IsOnPlane(Autodesk.DesignScript.Geometry.Point point, Autodes /// ![](../OpenMEPPage/geometry/dyn/pic/Point.Deconstruct.png) /// [MultiReturn("X", "Y", "Z")] - public static Dictionary Deconstruct ([DefaultArgument("Autodesk.DesignScript.Geometry.Point.ByCoordinates(0,0,0)")] Autodesk.DesignScript.Geometry.Point point) + public static Dictionary Deconstruct( + [DefaultArgument("Autodesk.DesignScript.Geometry.Point.ByCoordinates(0,0,0)")] + Autodesk.DesignScript.Geometry.Point point) { - if (point == null) throw new ArgumentNullException(nameof(point)); return new Dictionary { @@ -240,8 +262,7 @@ public static double Euclidean(Autodesk.DesignScript.Geometry.Point p1, Autodesk { return Euclidean(p1.X, p2.X, p1.Y, p2.Y, p1.Z, p2.Z); } - - + /// /// return distance between two points by Euclidean distance @@ -311,7 +332,7 @@ internal static double Euclidean(double x1, double x2, double y1, double y2, dou /// Permutation of list index matching optimize /// minimum cost can optimize /// index optimize can assignment - [MultiReturn("assignment","mincost")] + [MultiReturn("assignment", "mincost")] public static Dictionary AssignmentMatching(List lcMachines, List lcDevices) { @@ -324,6 +345,7 @@ internal static double Euclidean(double x1, double x2, double y1, double y2, dou cost[i, j] = manhattan; } } + // TODO : Array Matching Index int[,]? originCost = cost.Clone() as int[,]; List assignment = cost.FindAssignments().ToList(); @@ -333,6 +355,7 @@ internal static double Euclidean(double x1, double x2, double y1, double y2, dou { mincost += originCost[i, assignment[i]]; } + return new Dictionary() { {"assignment", assignment}, @@ -347,8 +370,8 @@ internal static double Euclidean(double x1, double x2, double y1, double y2, dou /// list location of devices /// minimum cost can optimize /// index optimize can assignment - [MultiReturn("assignment","mincost")] - public static Dictionary BruteForceMatching(List lcMachines, + [MultiReturn("assignment", "mincost")] + public static Dictionary BruteForceMatching(List lcMachines, List lcDevices) { int[,] cost = new int[lcMachines.Count, lcDevices.Count]; @@ -360,6 +383,7 @@ internal static double Euclidean(double x1, double x2, double y1, double y2, dou cost[i, j] = manhattan; } } + BruteForceMethod bruteForceMethod = new BruteForceMethod(); (int minCost, IEnumerable minAssignment) result = bruteForceMethod.BruteForce(cost); IEnumerable assignment = result.minAssignment; diff --git a/docs/OpenMEPPage/geometry/dyn/Point.ProjectOnToLine.dyn b/docs/OpenMEPPage/geometry/dyn/Point.ProjectOnToLine.dyn new file mode 100644 index 00000000..6bb037d9 --- /dev/null +++ b/docs/OpenMEPPage/geometry/dyn/Point.ProjectOnToLine.dyn @@ -0,0 +1,518 @@ +{ + "Uuid": "8f745431-3ef7-4418-a1f5-b6cbe51a1c92", + "IsCustomNode": false, + "Description": "", + "Name": "Point.ProjectOnToLine", + "ElementResolver": { + "ResolutionMap": {} + }, + "Inputs": [], + "Outputs": [], + "Nodes": [ + { + "ConcreteType": "Dynamo.Graph.Nodes.ZeroTouch.DSFunction, DynamoCore", + "Id": "eb5725ab2eb2488195ce198e20261476", + "NodeType": "FunctionNode", + "Inputs": [ + { + "Id": "1ea48a8268ea421888ce65a803356cd7", + "Name": "startPoint", + "Description": "Line start point\n\nPoint", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + }, + { + "Id": "f21128dcf6e646baa4556774bb28b801", + "Name": "endPoint", + "Description": "Line end point\n\nPoint", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "Outputs": [ + { + "Id": "ffc54d429e5c4aa2aab969f0c96655e1", + "Name": "Line", + "Description": "Line from start and end point", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "FunctionSignature": "Autodesk.DesignScript.Geometry.Line.ByStartPointEndPoint@Autodesk.DesignScript.Geometry.Point,Autodesk.DesignScript.Geometry.Point", + "Replication": "Auto", + "Description": "Creates a straight Line between two input Points.\n\nLine.ByStartPointEndPoint (startPoint: Point, endPoint: Point): Line" + }, + { + "ConcreteType": "Dynamo.Graph.Nodes.ZeroTouch.DSFunction, DynamoCore", + "Id": "0a3c49ee27794c68880218e75fce302d", + "NodeType": "FunctionNode", + "Inputs": [ + { + "Id": "0f84c24a032b42128794437f7f198385", + "Name": "x", + "Description": "X coordinate\n\ndouble\nDefault value : 0", + "UsingDefaultValue": true, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + }, + { + "Id": "645fbba37ba8482d9c92b9a90ae216ac", + "Name": "y", + "Description": "Y coordinate\n\ndouble\nDefault value : 0", + "UsingDefaultValue": true, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + }, + { + "Id": "490f255b4f854056882e0794478ded2c", + "Name": "z", + "Description": "Z coordinate\n\ndouble\nDefault value : 0", + "UsingDefaultValue": true, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "Outputs": [ + { + "Id": "3afe8e3d3b2948a683faf75cda858da9", + "Name": "Point", + "Description": "Point created by coordinates", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "FunctionSignature": "Autodesk.DesignScript.Geometry.Point.ByCoordinates@double,double,double", + "Replication": "Auto", + "Description": "Form a Point given 3 cartesian coordinates\n\nPoint.ByCoordinates (x: double = 0, y: double = 0, z: double = 0): Point" + }, + { + "ConcreteType": "Dynamo.Graph.Nodes.ZeroTouch.DSFunction, DynamoCore", + "Id": "67c098d4111040068be87cb9fa66edf1", + "NodeType": "FunctionNode", + "Inputs": [ + { + "Id": "82a52f630569487bafd16dd8157b781e", + "Name": "x", + "Description": "X coordinate\n\ndouble\nDefault value : 0", + "UsingDefaultValue": true, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + }, + { + "Id": "42e38bb41c7c4befa4182f2a5d008b7b", + "Name": "y", + "Description": "Y coordinate\n\ndouble\nDefault value : 0", + "UsingDefaultValue": true, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + }, + { + "Id": "7fd472d3f3964baf8032adebe2b43e22", + "Name": "z", + "Description": "Z coordinate\n\ndouble\nDefault value : 0", + "UsingDefaultValue": true, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "Outputs": [ + { + "Id": "d5edbf7bc0884990a928f4a4a6311428", + "Name": "Point", + "Description": "Point created by coordinates", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "FunctionSignature": "Autodesk.DesignScript.Geometry.Point.ByCoordinates@double,double,double", + "Replication": "Auto", + "Description": "Form a Point given 3 cartesian coordinates\n\nPoint.ByCoordinates (x: double = 0, y: double = 0, z: double = 0): Point" + }, + { + "ConcreteType": "Dynamo.Graph.Nodes.CodeBlockNodeModel, DynamoCore", + "Id": "9e01a72200cb42fd8cfdc35ee60ff983", + "NodeType": "CodeBlockNode", + "Inputs": [], + "Outputs": [ + { + "Id": "f48db55006be400d9ffd0416ee054b10", + "Name": "", + "Description": "Value of expression at line 1", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "Replication": "Disabled", + "Description": "Allows for DesignScript code to be authored directly", + "Code": "10;" + }, + { + "ConcreteType": "Dynamo.Graph.Nodes.ZeroTouch.DSFunction, DynamoCore", + "Id": "66c108e2a9d549059016937d4290fb39", + "NodeType": "FunctionNode", + "Inputs": [ + { + "Id": "4a05fb30f5d24f14bf79d40124fba2fb", + "Name": "x", + "Description": "X coordinate\n\ndouble\nDefault value : 0", + "UsingDefaultValue": true, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + }, + { + "Id": "cfd2b7d3435840668d40681765e48097", + "Name": "y", + "Description": "Y coordinate\n\ndouble\nDefault value : 0", + "UsingDefaultValue": true, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + }, + { + "Id": "f3d0626b5acf4cfe9143fa18b3351b89", + "Name": "z", + "Description": "Z coordinate\n\ndouble\nDefault value : 0", + "UsingDefaultValue": true, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "Outputs": [ + { + "Id": "92151f60fedc4c02a20a82f241a4fd7d", + "Name": "Point", + "Description": "Point created by coordinates", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "FunctionSignature": "Autodesk.DesignScript.Geometry.Point.ByCoordinates@double,double,double", + "Replication": "Auto", + "Description": "Form a Point given 3 cartesian coordinates\n\nPoint.ByCoordinates (x: double = 0, y: double = 0, z: double = 0): Point" + }, + { + "ConcreteType": "Dynamo.Graph.Nodes.ZeroTouch.DSFunction, DynamoCore", + "Id": "3723cd5b16dc490195ad480c15793e66", + "NodeType": "FunctionNode", + "Inputs": [ + { + "Id": "d09528e3870c42eea05d5de7f2f76208", + "Name": "point", + "Description": "Point need to project\n\nPoint", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + }, + { + "Id": "f60344b14b0e46bf935a7804b5e964df", + "Name": "line", + "Description": "Line to project the point\n\nLine", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "Outputs": [ + { + "Id": "563579f75d3f496297c47f5152dc7f99", + "Name": "point", + "Description": "projected point", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "FunctionSignature": "OpenMEPSandbox.Geometry.Point.ProjectOnToLine@Autodesk.DesignScript.Geometry.Point,Autodesk.DesignScript.Geometry.Line", + "Replication": "Auto", + "Description": "Project a point onto a line\n\nPoint.ProjectOnToLine (point: Point, line: Line): Point" + }, + { + "ConcreteType": "CoreNodeModels.Input.IntegerSlider, CoreNodeModels", + "NumberType": "Integer", + "MaximumValue": 30, + "MinimumValue": 1, + "StepValue": 1, + "Id": "25b30907f6384ece8a919239f82cadbc", + "NodeType": "NumberInputNode", + "Inputs": [], + "Outputs": [ + { + "Id": "03aaf5eef036422f840f824e16a03ba3", + "Name": "", + "Description": "Int64", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "Replication": "Disabled", + "Description": "Produces integer values", + "InputValue": 24 + }, + { + "ConcreteType": "Dynamo.Graph.Nodes.ZeroTouch.DSFunction, DynamoCore", + "Id": "da6e4d16ea8d4944beb81aebc212449a", + "NodeType": "FunctionNode", + "Inputs": [ + { + "Id": "1c8a72b7b160453fa2218b1641d9661b", + "Name": "startPoint", + "Description": "Line start point\n\nPoint", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + }, + { + "Id": "7c629a68cf83479dbf0799c066fe46f9", + "Name": "endPoint", + "Description": "Line end point\n\nPoint", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "Outputs": [ + { + "Id": "944a268822724ebc993dbfdc38e8d368", + "Name": "Line", + "Description": "Line from start and end point", + "UsingDefaultValue": false, + "Level": 2, + "UseLevels": false, + "KeepListStructure": false + } + ], + "FunctionSignature": "Autodesk.DesignScript.Geometry.Line.ByStartPointEndPoint@Autodesk.DesignScript.Geometry.Point,Autodesk.DesignScript.Geometry.Point", + "Replication": "Auto", + "Description": "Creates a straight Line between two input Points.\n\nLine.ByStartPointEndPoint (startPoint: Point, endPoint: Point): Line" + } + ], + "Connectors": [ + { + "Start": "ffc54d429e5c4aa2aab969f0c96655e1", + "End": "f60344b14b0e46bf935a7804b5e964df", + "Id": "f8f7934d0da946a6bdd6d6aa5c287ebb", + "IsHidden": "False" + }, + { + "Start": "3afe8e3d3b2948a683faf75cda858da9", + "End": "1ea48a8268ea421888ce65a803356cd7", + "Id": "4e79539c97ff461f9f06ae42104445e2", + "IsHidden": "False" + }, + { + "Start": "d5edbf7bc0884990a928f4a4a6311428", + "End": "f21128dcf6e646baa4556774bb28b801", + "Id": "d88cce784e144333bba83f5ba3ef2803", + "IsHidden": "False" + }, + { + "Start": "f48db55006be400d9ffd0416ee054b10", + "End": "82a52f630569487bafd16dd8157b781e", + "Id": "517e524c1d174c039b407431275cd9c7", + "IsHidden": "False" + }, + { + "Start": "f48db55006be400d9ffd0416ee054b10", + "End": "7fd472d3f3964baf8032adebe2b43e22", + "Id": "7868abfa636a443d859e1d883205c5e7", + "IsHidden": "False" + }, + { + "Start": "92151f60fedc4c02a20a82f241a4fd7d", + "End": "d09528e3870c42eea05d5de7f2f76208", + "Id": "1835c25ab3624b449a288b2566417d4f", + "IsHidden": "False" + }, + { + "Start": "92151f60fedc4c02a20a82f241a4fd7d", + "End": "1c8a72b7b160453fa2218b1641d9661b", + "Id": "0ea0c341db2b4e26a2931993f7feaf4f", + "IsHidden": "False" + }, + { + "Start": "563579f75d3f496297c47f5152dc7f99", + "End": "7c629a68cf83479dbf0799c066fe46f9", + "Id": "679904bacda24551b064db47963e86a8", + "IsHidden": "False" + }, + { + "Start": "03aaf5eef036422f840f824e16a03ba3", + "End": "cfd2b7d3435840668d40681765e48097", + "Id": "efaa0b0102e641969f181263d66d01be", + "IsHidden": "False" + }, + { + "Start": "03aaf5eef036422f840f824e16a03ba3", + "End": "4a05fb30f5d24f14bf79d40124fba2fb", + "Id": "993ae9826f31441299d5ec52ddcee68c", + "IsHidden": "False" + } + ], + "Dependencies": [], + "NodeLibraryDependencies": [ + { + "Name": "OpenMEP", + "Version": "1.0.0", + "ReferenceType": "Package", + "Nodes": [ + "3723cd5b16dc490195ad480c15793e66" + ] + } + ], + "Thumbnail": "", + "GraphDocumentationURL": null, + "ExtensionWorkspaceData": [ + { + "ExtensionGuid": "28992e1d-abb9-417f-8b1b-05e053bee670", + "Name": "Properties", + "Version": "2.18", + "Data": {} + } + ], + "Author": "", + "Linting": { + "activeLinter": "None", + "activeLinterId": "7b75fb44-43fd-4631-a878-29f4d5d8399a", + "warningCount": 0, + "errorCount": 0 + }, + "Bindings": [], + "View": { + "Dynamo": { + "ScaleFactor": 1.0, + "HasRunWithoutCrash": true, + "IsVisibleInDynamoLibrary": true, + "Version": "2.18.0.2986", + "RunType": "Automatic", + "RunPeriod": "1000" + }, + "Camera": { + "Name": "_Background Preview", + "EyeX": -48.165916442871094, + "EyeY": 62.000225067138672, + "EyeZ": -83.030197143554688, + "LookX": 41.4981689453125, + "LookY": -63.968593597412109, + "LookZ": 86.961479187011719, + "UpX": 0.15574347972869873, + "UpY": 0.93232488632202148, + "UpZ": 0.32636556029319763 + }, + "ConnectorPins": [], + "NodeViews": [ + { + "Id": "eb5725ab2eb2488195ce198e20261476", + "Name": "Line.ByStartPointEndPoint", + "IsSetAsInput": false, + "IsSetAsOutput": false, + "Excluded": false, + "ShowGeometry": true, + "X": 702.85854271548783, + "Y": 350.13004188126632 + }, + { + "Id": "0a3c49ee27794c68880218e75fce302d", + "Name": "Point.ByCoordinates", + "IsSetAsInput": false, + "IsSetAsOutput": false, + "Excluded": false, + "ShowGeometry": true, + "X": 350.79999999999995, + "Y": 284.0 + }, + { + "Id": "67c098d4111040068be87cb9fa66edf1", + "Name": "Point.ByCoordinates", + "IsSetAsInput": false, + "IsSetAsOutput": false, + "Excluded": false, + "ShowGeometry": true, + "X": 338.79999999999995, + "Y": 532.8 + }, + { + "Id": "9e01a72200cb42fd8cfdc35ee60ff983", + "Name": "Code Block", + "IsSetAsInput": false, + "IsSetAsOutput": false, + "Excluded": false, + "ShowGeometry": true, + "X": 72.3849244848625, + "Y": 539.04849237206315 + }, + { + "Id": "66c108e2a9d549059016937d4290fb39", + "Name": "Point.ByCoordinates", + "IsSetAsInput": false, + "IsSetAsOutput": false, + "Excluded": false, + "ShowGeometry": true, + "X": 338.0, + "Y": 808.0 + }, + { + "Id": "3723cd5b16dc490195ad480c15793e66", + "Name": "Point.ProjectOnToLine", + "IsSetAsInput": false, + "IsSetAsOutput": false, + "Excluded": false, + "ShowGeometry": true, + "X": 757.00116122348538, + "Y": 694.38850621192751 + }, + { + "Id": "25b30907f6384ece8a919239f82cadbc", + "Name": "Integer Slider", + "IsSetAsInput": false, + "IsSetAsOutput": false, + "Excluded": false, + "ShowGeometry": true, + "X": -319.25670333398091, + "Y": 859.59693603225412 + }, + { + "Id": "da6e4d16ea8d4944beb81aebc212449a", + "Name": "Line.ByStartPointEndPoint", + "IsSetAsInput": false, + "IsSetAsOutput": false, + "Excluded": false, + "ShowGeometry": true, + "X": 1175.2591439946623, + "Y": 563.56670693401566 + } + ], + "Annotations": [], + "X": 348.74039050993656, + "Y": 6.921173453660515, + "Zoom": 0.61610714732743088 + } +} \ No newline at end of file diff --git a/docs/OpenMEPPage/geometry/dyn/pic/Point.ProjectOnToLine.gif b/docs/OpenMEPPage/geometry/dyn/pic/Point.ProjectOnToLine.gif new file mode 100644 index 00000000..dc894a59 Binary files /dev/null and b/docs/OpenMEPPage/geometry/dyn/pic/Point.ProjectOnToLine.gif differ