Exemple #1
0
        // 2 Points, 2 Heights
        private void DrawInsulationOnTwoPointsTwoHeights(PromptPointResult firstPoint)
        {
            #region input data

            var firstPointResult  = firstPoint;
            var secondPointResult = _editorHelper.PromptForPoint("\nSelect SECOND point.", true, true,
                                                                 firstPointResult.Value);
            if (secondPointResult.Status != PromptStatus.OK)
            {
                return;
            }

            var thicknessAtFirstPointResult = _editorHelper.PromptForDouble("\nThickness at FIRST point : ",
                                                                            Settings.Default
                                                                            .SInsulationThicknessAtFirstPoint);
            if (thicknessAtFirstPointResult.Status != PromptStatus.OK)
            {
                return;
            }
            Settings.Default.SInsulationThicknessAtFirstPoint = thicknessAtFirstPointResult.Value;

            var thicknessAtSecondPointResult = _editorHelper.PromptForDouble("\nThickness at SECOND point : ",
                                                                             Settings.Default
                                                                             .SInsulationThicknessAtSecondPoint);
            if (thicknessAtSecondPointResult.Status != PromptStatus.OK)
            {
                return;
            }
            Settings.Default.SInsulationThicknessAtSecondPoint = thicknessAtSecondPointResult.Value;
            Settings.Default.Save();

            if (Math.Abs(firstPointResult.Value.Z) > 0.00001 || Math.Abs(secondPointResult.Value.Z) > 0.00001)
            {
                _editorHelper.WriteMessage("Soft Insulation should be placed in OXY plane !");
                _logger.Info("User input is invalid.");
                return;
            }
            #endregion

            #region preparation

            var minThickness = (thicknessAtFirstPointResult.Value < thicknessAtSecondPointResult.Value)
                                   ? thicknessAtFirstPointResult.Value
                                   : thicknessAtSecondPointResult.Value;
            var segmentsCount =
                (int)Math.Ceiling((firstPointResult.Value.DistanceTo(secondPointResult.Value) / minThickness) / 0.35);

            var     botLeftPoint = new Complex(0, 0);
            var     botRightPoint = new Complex(firstPointResult.Value.DistanceTo(secondPointResult.Value), 0);
            Complex topLeftPoint, topRightPoint;
            if (thicknessAtFirstPointResult.Value <= thicknessAtSecondPointResult.Value)
            {
                topLeftPoint  = new Complex(0, thicknessAtFirstPointResult.Value);
                topRightPoint = new Complex(firstPointResult.Value.DistanceTo(secondPointResult.Value),
                                            thicknessAtSecondPointResult.Value);
            }
            else
            {
                topLeftPoint  = new Complex(0, thicknessAtSecondPointResult.Value);
                topRightPoint = new Complex(firstPointResult.Value.DistanceTo(secondPointResult.Value),
                                            thicknessAtFirstPointResult.Value);
            }

            var vectorOfBaseLine = new Complex(secondPointResult.Value.X, secondPointResult.Value.Y) -
                                   new Complex(firstPointResult.Value.X, firstPointResult.Value.Y);

            var radiusBotCircle = firstPointResult.Value.DistanceTo(secondPointResult.Value) / (segmentsCount + 0.5);
            radiusBotCircle /= 2.0;

            var vectorTopEdge         = topRightPoint - topLeftPoint;
            var vectorTopEdgeOrt      = vectorTopEdge / vectorTopEdge.abs();
            var vectorNormalOfTopEdge = vectorTopEdgeOrt * (new Complex(0, 1.0));

            #endregion

            #region calculateCenterCircle

            var centersBotCircles = new List <Complex>();
            for (var i = 0; i < segmentsCount + 1; i++)
            {
                centersBotCircles.Add(new Complex(i * 2 * radiusBotCircle, radiusBotCircle));
            }

            var centersTopCircles = new List <KeyValuePair <double, Complex> >();
            var ordinate          = new Line2d(new Complex(radiusBotCircle, 0), new Complex(radiusBotCircle, 100));
            var offsetTopEdge     = new Line2d(topLeftPoint - vectorNormalOfTopEdge * radiusBotCircle,
                                               topRightPoint - vectorNormalOfTopEdge * radiusBotCircle);
            var centerFirstUpperCircle = offsetTopEdge.IntersectWitch(ordinate);
            centersTopCircles.Add(new KeyValuePair <double, Complex>(radiusBotCircle, centerFirstUpperCircle));

            if (((topRightPoint - topLeftPoint).arg()) * 180.0 / Math.PI <= 5)
            {
                for (var i = 1; i < segmentsCount + 1; i++)
                {
                    var rightVerticalEdge = new Line2d(botRightPoint, topRightPoint);
                    var lineParallelToX   = new Line2d(centersTopCircles[i - 1].Value,
                                                       centersTopCircles[i - 1].Value +
                                                       new Complex(rightVerticalEdge.A, rightVerticalEdge.B));
                    var distFromCurrentCircleToRightVertEdge =
                        Math.Abs(
                            (centersTopCircles[i - 1].Value - lineParallelToX.IntersectWitch(rightVerticalEdge)).abs() -
                            centersTopCircles[i - 1].Key);
                    var radiusTopCircle = (distFromCurrentCircleToRightVertEdge / (segmentsCount - i + 0.5)) / 2.0;

                    var rR = centersTopCircles[i - 1].Key + radiusTopCircle;
                    var dR = Math.Abs(radiusTopCircle - centersTopCircles[i - 1].Key);
                    var distBetweenCenters  = Math.Sqrt(rR * rR - dR * dR);
                    var centerNextTopCircle = centersTopCircles[i - 1].Value - vectorNormalOfTopEdge * dR +
                                              vectorTopEdgeOrt * distBetweenCenters;
                    centersTopCircles.Add(new KeyValuePair <double, Complex>(radiusTopCircle, centerNextTopCircle));
                }
            }
            else
            {
                for (var i = 1; i < segmentsCount + 1; i++)
                {
                    var tangentPoints = GetTangentPointsOfCommonExternalTanget(centersBotCircles[i], radiusBotCircle,
                                                                               centersTopCircles[i - 1].Value,
                                                                               centersTopCircles[i - 1].Key, true);
                    var vectorCommonTangent        = tangentPoints.Value - tangentPoints.Key;
                    var vectorCommonTangentOrt     = vectorCommonTangent / vectorCommonTangent.abs();
                    var vectorTranslationTopCircle = vectorCommonTangentOrt * (new Complex(0, 1.0));

                    var dL = new Line2d(tangentPoints.Value, tangentPoints.Value + vectorTranslationTopCircle * 100);
                    var rightVerticalEdge = new Line2d(botRightPoint, topRightPoint);
                    var dist            = (tangentPoints.Value - dL.IntersectWitch(rightVerticalEdge)).abs();
                    var radiusTopCircle = (dist / (segmentsCount - i + 0.5)) / 2.0;

                    var hlpLine = new Line2d(tangentPoints.Key - vectorTranslationTopCircle * radiusTopCircle,
                                             tangentPoints.Value - vectorTranslationTopCircle * radiusTopCircle);
                    var offsetTopEdgeOnRadiusTopCircle = new Line2d(
                        topLeftPoint - vectorNormalOfTopEdge * radiusTopCircle,
                        topRightPoint - vectorNormalOfTopEdge * radiusTopCircle);
                    centersTopCircles.Add(new KeyValuePair <double, Complex>(radiusTopCircle,
                                                                             offsetTopEdgeOnRadiusTopCircle
                                                                             .IntersectWitch(hlpLine)));
                }
            }

            #endregion

            #region calculatePointsForPolylineInsulation
            var insulationPolyline = new Polyline();
            insulationPolyline.SetDatabaseDefaults();
            insulationPolyline.AddVertexAt(0, new Point2d(0, 0), 0, 0, 0);
            var firstPairTangentPoints = GetTangentPointsOfCommonInternalTanget(centersBotCircles[0],
                                                                                radiusBotCircle,
                                                                                centersTopCircles[0].Value,
                                                                                centersTopCircles[0].Key, false);
            var ang = ((firstPairTangentPoints.Key - centersBotCircles[0]) / -centersBotCircles[0]).arg();
            insulationPolyline.AddVertexAt(0,
                                           new Point2d(firstPairTangentPoints.Key.real(),
                                                       firstPairTangentPoints.Key.imag()), -Math.Tan(ang / 4), 0, 0);
            insulationPolyline.AddVertexAt(0,
                                           new Point2d(firstPairTangentPoints.Value.real(),
                                                       firstPairTangentPoints.Value.imag()), 0, 0, 0);
            var secondPairTangentPoints = GetTangentPointsOfCommonInternalTanget(centersBotCircles[1],
                                                                                 radiusBotCircle,
                                                                                 centersTopCircles[0].Value,
                                                                                 centersTopCircles[0].Key, true);
            ang =
                ((centersTopCircles[0].Value - firstPairTangentPoints.Value) /
                 (centersTopCircles[0].Value - secondPairTangentPoints.Value)).arg();
            insulationPolyline.AddVertexAt(0,
                                           new Point2d(secondPairTangentPoints.Value.real(),
                                                       secondPairTangentPoints.Value.imag()), Math.Tan(ang / 4), 0,
                                           0);
            insulationPolyline.AddVertexAt(0,
                                           new Point2d(secondPairTangentPoints.Key.real(),
                                                       secondPairTangentPoints.Key.imag()), 0, 0, 0);
            var oldPair = secondPairTangentPoints;
            for (var i = 1; i < segmentsCount; i++)
            {
                var pairBotRightTopLeft = GetTangentPointsOfCommonInternalTanget(centersBotCircles[i],
                                                                                 radiusBotCircle,
                                                                                 centersTopCircles[i].Value,
                                                                                 centersTopCircles[i].Key,
                                                                                 false);
                var pairTopRightBotLeft = GetTangentPointsOfCommonInternalTanget(centersBotCircles[i + 1],
                                                                                 radiusBotCircle,
                                                                                 centersTopCircles[i].Value,
                                                                                 centersTopCircles[i].Key,
                                                                                 true);
                ang = ((pairBotRightTopLeft.Key - centersBotCircles[i]) / (oldPair.Key - centersBotCircles[i])).arg();
                insulationPolyline.AddVertexAt(0,
                                               new Point2d(pairBotRightTopLeft.Key.real(),
                                                           pairBotRightTopLeft.Key.imag()),
                                               -Math.Tan(ang / 4), 0, 0);
                insulationPolyline.AddVertexAt(0,
                                               new Point2d(pairBotRightTopLeft.Value.real(),
                                                           pairBotRightTopLeft.Value.imag()), 0, 0, 0);

                ang =
                    ((centersTopCircles[i].Value - pairBotRightTopLeft.Value) /
                     (centersTopCircles[i].Value - pairTopRightBotLeft.Value)).arg();
                insulationPolyline.AddVertexAt(0,
                                               new Point2d(pairTopRightBotLeft.Value.real(),
                                                           pairTopRightBotLeft.Value.imag()),
                                               Math.Tan(ang / 4), 0, 0);
                insulationPolyline.AddVertexAt(0,
                                               new Point2d(pairTopRightBotLeft.Key.real(),
                                                           pairTopRightBotLeft.Key.imag()), 0, 0, 0);
                oldPair = pairTopRightBotLeft;
            }
            var lastPairTangentPoints = GetTangentPointsOfCommonInternalTanget(centersBotCircles[segmentsCount],
                                                                               radiusBotCircle,
                                                                               centersTopCircles[segmentsCount]
                                                                               .Value,
                                                                               centersTopCircles[segmentsCount].Key,
                                                                               false);
            ang =
                ((lastPairTangentPoints.Key - centersBotCircles[segmentsCount]) /
                 (oldPair.Key - centersBotCircles[segmentsCount])).arg();
            insulationPolyline.AddVertexAt(0,
                                           new Point2d(lastPairTangentPoints.Key.real(),
                                                       lastPairTangentPoints.Key.imag()), -Math.Tan(ang / 4), 0, 0);
            insulationPolyline.AddVertexAt(0,
                                           new Point2d(lastPairTangentPoints.Value.real(),
                                                       lastPairTangentPoints.Value.imag()), 0, 0, 0);

            var hlpPointForLastBulge = new Complex(centersTopCircles[segmentsCount].Value.real(),
                                                   centersTopCircles[segmentsCount].Value.imag() +
                                                   centersTopCircles[segmentsCount].Key);
            ang =
                ((centersTopCircles[segmentsCount].Value - lastPairTangentPoints.Value) /
                 (centersTopCircles[segmentsCount].Value - hlpPointForLastBulge)).arg();
            insulationPolyline.AddVertexAt(0, new Point2d(hlpPointForLastBulge.real(), hlpPointForLastBulge.imag()),
                                           Math.Tan(ang / 4), 0, 0);

            #endregion

            #region add contur to poly

            insulationPolyline.AddVertexAt(0, new Point2d(topRightPoint.real(), hlpPointForLastBulge.imag()), 0, 0,
                                           0);
            insulationPolyline.AddVertexAt(0, new Point2d(botRightPoint.real(), botRightPoint.imag()), 0, 0, 0);
            insulationPolyline.AddVertexAt(0, new Point2d(botLeftPoint.real(), botLeftPoint.imag()), 0, 0, 0);
            insulationPolyline.AddVertexAt(0, new Point2d(topLeftPoint.real(), topLeftPoint.imag()), 0, 0, 0);
            insulationPolyline.AddVertexAt(0, new Point2d(topRightPoint.real(), topRightPoint.imag()), 0, 0, 0);
            insulationPolyline.AddVertexAt(0, new Point2d(topRightPoint.real(), hlpPointForLastBulge.imag()), 0, 0,
                                           0);

            #endregion

            #region transforms

            if (thicknessAtFirstPointResult.Value > thicknessAtSecondPointResult.Value)
            {
                var acPtFrom = new Point3d(botRightPoint.x / 2, botRightPoint.y / 2, 0);
                var acPtTo   = new Point3d(botRightPoint.x / 2, 100, 0);
                var acLine3d = new Line3d(acPtFrom, acPtTo);
                insulationPolyline.TransformBy(Matrix3d.Mirroring(acLine3d));
            }
            insulationPolyline.TransformBy(Matrix3d.Rotation(vectorOfBaseLine.arg(), new Vector3d(0, 0, 1),
                                                             Point3d.Origin));
            insulationPolyline.TransformBy(Matrix3d.Displacement(Point3d.Origin.GetVectorTo(firstPointResult.Value)));
            insulationPolyline.TransformBy(_editorHelper.CurrentUcs);

            #endregion

            var oldLayer =
                Application.DocumentManager.MdiActiveDocument.Editor.Document
                .Database.Clayer;
            _documentHelper.LayerManipulator.CreateLayer("3-0", System.Drawing.Color.Lime);

            var softInsulationBlock = new BlockTableRecord();
            var nameSalt            = DateTime.Now.GetHashCode().ToString();
            softInsulationBlock.Name   = "SoftInsulation_" + nameSalt;
            softInsulationBlock.Origin = firstPointResult.Value;

            insulationPolyline.Layer = "0";

            #region addObjectsToDataBase
            using (var acTrans = _documentHelper.TransactionManager.StartTransaction())
            {
                var blockTable =
                    acTrans.GetObject(
                        Application.DocumentManager.MdiActiveDocument.Editor
                        .Document.Database.BlockTableId, OpenMode.ForWrite) as BlockTable;

                blockTable.Add(softInsulationBlock);
                acTrans.AddNewlyCreatedDBObject(softInsulationBlock, true);

                softInsulationBlock.AppendEntity(insulationPolyline);
                acTrans.AddNewlyCreatedDBObject(insulationPolyline, true);

                var rigidInsulationRef = new BlockReference(firstPointResult.Value,
                                                            softInsulationBlock.ObjectId)
                {
                    Layer = "3-0"
                };
                var currentSpace =
                    (BlockTableRecord)
                    acTrans.GetObject(
                        Application.DocumentManager.MdiActiveDocument.Editor
                        .Document.Database.CurrentSpaceId, OpenMode.ForWrite);

                currentSpace.AppendEntity(rigidInsulationRef);
                acTrans.AddNewlyCreatedDBObject(rigidInsulationRef, true);
                acTrans.Commit();
            }
            #endregion

            _documentHelper.LayerManipulator.ChangeLayer(oldLayer);
        }