예제 #1
0
        /// <summary>
        /// Метод, создающий панель управления клавиатуры.
        /// </summary>
        /// <param name="document3D"></param>
        /// <param name="data"></param>
        public override void Build(ksDocument3D document3D,
                                   KeyboardParametersStorage data)
        {
            if (document3D == null || data == null)
            {
                throw new NullReferenceException("Метод ссылается на null объект.");
            }

            if (data.PanelDisplay == true)
            {
                DisplayBuild(document3D, data);
            }
            if (data.PanelButtons == true)
            {
                ButtonsBuild(document3D, data);
            }
            if (data.PanelKnobs == true)
            {
                KnobsBuild(document3D, data);
            }
            if (data.PanelWheel != WheelSetup.Disable)
            {
                WheelSpaceBuild(document3D, data);
                WheelBuild(document3D, data);
            }
        }
예제 #2
0
        private void LineDraw(ksDocument2D sketch,
                              KeyboardParametersStorage data, SketchType sketchType)
        {
            switch (sketchType)
            {
            case SketchType.BlackKeyCut:
            {
                sketch.ksLineSeg(-data.BodyHeight + 0.1, 5.5,
                                 -data.BodyHeight + 0.1, 6.5, 1);
                sketch.ksLineSeg(-data.BodyHeight + 0.1, 6.5,
                                 -data.BodyHeight + 1.4, 5.5, 1);
                sketch.ksLineSeg(-data.BodyHeight + 1.4, 5.5,
                                 -data.BodyHeight + 0.1, 5.5, 1);

                sketch.ksLineSeg(-data.BodyHeight + 0.1, 15.5,
                                 -data.BodyHeight + 0.1, 15.0, 1);
                sketch.ksLineSeg(-data.BodyHeight + 0.1, 15.0,
                                 -data.BodyHeight + 1.375, 15.0, 1);
                sketch.ksLineSeg(-data.BodyHeight + 1.375, 15.0,
                                 -data.BodyHeight + 1.375, 15.5, 1);
                sketch.ksLineSeg(-data.BodyHeight + 1.375, 15.5,
                                 -data.BodyHeight + 0.1, 15.5, 1);
                break;
            }

            default:
            {
                break;
            }
            }
        }
예제 #3
0
        /// <summary>
        /// Метод выдавливания верхней части тела клавиатуры.
        /// </summary>
        /// <param name="data"></param>
        /// <param name="entity"></param>
        private void BodyExtruseTop(KeyboardParametersStorage data,
                                    ksEntity entity)
        {
            var entityExtrusion = (ksEntity)part.NewEntity((short)Obj3dType.o3d_baseExtrusion);

            if (entityExtrusion != null)
            {
                entityExtrusion.name = "Выдавливание тела";

                var extrusionDefinition = (ksBaseExtrusionDefinition)entityExtrusion.GetDefinition();
                if (extrusionDefinition != null)
                {
                    extrusionDefinition.directionType = (short)Direction_Type.dtNormal;
                    extrusionDefinition.SetSideParam(true,
                                                     (short)End_Type.etBlind, data.BodyHeight -
                                                     (data.BodyHeight - 3.5));
                    extrusionDefinition.SetThinParam(false, 0, 0, 0);
                    extrusionDefinition.SetSketch(entity);

                    entityExtrusion.SetAdvancedColor(Color.FromArgb(120, 120, 120).ToArgb(),
                                                     .0, .0, .0, .0, 100, 100);
                    entityExtrusion.Create();
                }
            }
        }
예제 #4
0
        /// <summary>
        /// Метод построения разъемов MIDI.
        /// </summary>
        /// <param name="document3D"></param>
        /// <param name="data"></param>
        private void MIDIBuild(ksDocument3D document3D,
                               KeyboardParametersStorage data)
        {
            part = (ksPart)document3D.GetPart((short)Part_Type.pTop_Part);

            var entityOffsetPlane = (ksEntity)part.NewEntity((short)Obj3dType.o3d_planeOffset);
            var entitySketch      = (ksEntity)part.NewEntity((short)Obj3dType.o3d_sketch);

            entitySketch.name = "Разъемы MIDI";

            if (entityOffsetPlane != null)
            {
                var offsetDefinition = (ksPlaneOffsetDefinition)entityOffsetPlane.GetDefinition();
                if (offsetDefinition != null)
                {
                    var basePlane = (ksEntity)part.GetDefaultEntity((short)Obj3dType.o3d_planeXOZ);
                    basePlane.name = "Начальная плоскость";

                    offsetDefinition.direction = false;
                    offsetDefinition.offset    = data.BodyDepth;
                    offsetDefinition.SetPlane(basePlane);

                    entityOffsetPlane.name   = "Смещенная плоскость";
                    entityOffsetPlane.hidden = true;
                    entityOffsetPlane.Create();

                    var sketchDef = (ksSketchDefinition)entitySketch.GetDefinition();
                    if (sketchDef != null)
                    {
                        sketchDef.SetPlane(entityOffsetPlane);
                        entitySketch.Create();

                        var sketchEdit = (ksDocument2D)sketchDef.BeginEdit();

                        for (int i = 0; i < data.CommutationMIDI; i++)
                        {
                            sketchEdit.ksCircle(-(_margin), -2.5, 0.75, 1);
                            sketchEdit.ksCircle(-(_margin), -2.5, 0.7, 1);


                            sketchEdit.ksCircle(-(_margin) - 0.350, -2.5,
                                                0.05, 1);
                            sketchEdit.ksCircle(-(_margin) - 0.2625, -2.2375,
                                                0.05, 1);
                            sketchEdit.ksCircle(-(_margin), -2.150, 0.05, 1);
                            sketchEdit.ksCircle(-(_margin) + 0.2625, -2.2375,
                                                0.05, 1);
                            sketchEdit.ksCircle(-(_margin) + 0.350, -2.5,
                                                0.05, 1);

                            // Производим обновление отступа для следующего
                            // разъема.
                            _margin += 2.5;
                        }
                        sketchDef.EndEdit();
                        CutMIDI(part, entitySketch);
                    }
                }
            }
        }
예제 #5
0
        /// <summary>
        /// Метод, строящий эскиз для вырезания скоса у черных клавиш.
        /// </summary>
        /// <param name="document3D">Указатель на активный документ КОМПАС-3D.</param>
        /// <param name="data">Указатель на данные.</param>
        private void BlackKeyCutSketch(ksDocument3D document3D,
                                       KeyboardParametersStorage data)
        {
            string name   = "Черные клавиши";
            double offset = (data.BodyLength / 2) - (data.BoardLength / 2)
                            + _space;

            OffsetSketchSet(document3D, data, name, offset, Obj3dType.o3d_planeYOZ);
        }
예제 #6
0
        /// <summary>
        /// Метод, строящий дисплей.
        /// </summary>
        /// <param name="document3D"></param>
        /// <param name="data"></param>
        private void DisplayBuild(ksDocument3D document3D,
                                  KeyboardParametersStorage data)
        {
            // Переменные центрования.
            //
            double horCenter = data.BodyLength / 2;
            double verCenter = data.BodyDepth - ((data.BodyDepth - 15.5)
                                                 / 2);

            part = (ksPart)document3D.GetPart((short)Part_Type.pTop_Part);

            var entityOffsetPlane = (ksEntity)part.NewEntity((short)Obj3dType.o3d_planeOffset);
            var entitySketch      = (ksEntity)part.NewEntity((short)Obj3dType.o3d_sketch);

            entitySketch.name = "Дисплей";

            if (entityOffsetPlane != null)
            {
                var offsetDef = (ksPlaneOffsetDefinition)entityOffsetPlane.GetDefinition();
                if (offsetDef != null)
                {
                    var basePlane = (ksEntity)part.GetDefaultEntity((short)Obj3dType.o3d_planeXOY);

                    basePlane.name = "Начальная плоскость";

                    offsetDef.direction = true;
                    offsetDef.offset    = data.BodyHeight;
                    offsetDef.SetPlane(basePlane);

                    entityOffsetPlane.name   = "Смещенная плоскость";
                    entityOffsetPlane.hidden = true;
                    entityOffsetPlane.Create();

                    var sketchDef = (ksSketchDefinition)entitySketch.GetDefinition();
                    if (sketchDef != null)
                    {
                        sketchDef.SetPlane(entityOffsetPlane);

                        entitySketch.Create();

                        var sketchEdit = (ksDocument2D)sketchDef.BeginEdit();

                        sketchEdit.ksLineSeg(-horCenter + 5.0, -verCenter
                                             + 3.0, -horCenter + 5.0, -verCenter - 3.0, 1);
                        sketchEdit.ksLineSeg(-horCenter + 5.0, -verCenter
                                             - 3.0, -horCenter - 5.0, -verCenter - 3.0, 1);
                        sketchEdit.ksLineSeg(-horCenter - 5.0, -verCenter
                                             - 3.0, -horCenter - 5.0, -verCenter + 3.0, 1);
                        sketchEdit.ksLineSeg(-horCenter - 5.0, -verCenter
                                             + 3.0, -horCenter + 5.0, -verCenter + 3.0, 1);

                        sketchDef.EndEdit();
                        DisplayExtruse(part, entitySketch);
                    }
                }
            }
        }
예제 #7
0
        /// <summary>
        /// Метод построения коммутационной панели.
        /// </summary>
        /// <param name="document3D"></param>
        /// <param name="data"></param>
        public override void Build(ksDocument3D document3D,
                                   KeyboardParametersStorage data)
        {
            if (document3D == null || data == null)
            {
                throw new NullReferenceException("Метод ссылается на null объект.");
            }

            XLRBuild(document3D, data);
            TRSBuild(document3D, data);
            MIDIBuild(document3D, data);
        }
예제 #8
0
        /// <summary>
        /// Метод, строящий клавиатурную секцию.
        /// </summary>
        /// <param name="document3D">Указатель на активный документ КОМПАС-3D.</param>
        /// <param name="data">Указатель на данные.</param>
        public override void Build(ksDocument3D document3D,
                                   KeyboardParametersStorage data)
        {
            if (document3D == null || data == null)
            {
                throw new NullReferenceException("Метод ссылается на null объект.");
            }

            // Текущая обрабатываемая клавиша.
            KeyNote currentKey = SetCurrentNote(data);

            KeyBuild(document3D, data, currentKey);
        }
예제 #9
0
        /// <summary>
        /// Метод, создающий колесо модуляции.
        /// </summary>
        /// <param name="document3D"></param>
        /// <param name="data"></param>
        private void WheelBuild(ksDocument3D document3D,
                                KeyboardParametersStorage data)
        {
            part = (ksPart)document3D.GetPart((short)Part_Type.pTop_Part);

            var entityOffsetPlane = (ksEntity)part.NewEntity((short)Obj3dType.o3d_planeOffset);
            var entitySketch      = (ksEntity)part.NewEntity((short)Obj3dType.o3d_sketch);

            entitySketch.name = "Колесо модуляции";

            if (entityOffsetPlane != null)
            {
                var offsetDef = (ksPlaneOffsetDefinition)entityOffsetPlane.GetDefinition();
                if (offsetDef != null)
                {
                    var basePlane = (ksEntity)part.GetDefaultEntity((short)Obj3dType.o3d_planeYOZ);

                    basePlane.name = "Начальная плоскость";

                    offsetDef.direction = true;
                    offsetDef.offset    = 1.5;
                    offsetDef.SetPlane(basePlane);

                    entityOffsetPlane.name   = "Смещенная плоскость";
                    entityOffsetPlane.hidden = true;
                    entityOffsetPlane.Create();

                    var sketchDef = (ksSketchDefinition)entitySketch.GetDefinition();
                    if (sketchDef != null)
                    {
                        sketchDef.SetPlane(entityOffsetPlane);
                        entitySketch.Create();

                        var sketchEdit = (ksDocument2D)sketchDef.BeginEdit();

                        if (data.PanelWheel == WheelSetup.EnableFront)
                        {
                            sketchEdit.ksCircle(-data.BodyHeight + 1.0, 8.0,
                                                3.0, 1);
                        }
                        else if (data.PanelWheel == WheelSetup.EnableBack)
                        {
                            sketchEdit.ksCircle(-data.BodyHeight + 1.0,
                                                data.BodyDepth - 8.0, 3.0, 1);
                        }
                        sketchDef.EndEdit();
                        WheelExtruse(part, entitySketch);
                    }
                }
            }
        }
예제 #10
0
        private void OffsetSketchSet(ksDocument3D document3D,
                                     KeyboardParametersStorage data, string sketchName,
                                     double offset, Obj3dType obj3DType)
        {
            SketchType sketchType = SketchType.BlackKeyCut;


            part = (ksPart)document3D.GetPart((short)Part_Type.pTop_Part);

            var entityOffsetPlane = (ksEntity)part.NewEntity((short)Obj3dType.o3d_planeOffset);
            var entitySketch      = (ksEntity)part.NewEntity((short)Obj3dType.o3d_sketch);

            entitySketch.name = sketchName;
            if (entityOffsetPlane != null)
            {
                var offsetDef = (ksPlaneOffsetDefinition)entityOffsetPlane.GetDefinition();
                if (offsetDef != null)
                {
                    offsetDef.direction = true;
                    offsetDef.offset    = offset;

                    var basePlane = (ksEntity)part.GetDefaultEntity((short)obj3DType);
                    basePlane.name = "Начальная плоскость";

                    offsetDef.SetPlane(basePlane);

                    entityOffsetPlane.name   = "Смещенная плоскость";
                    entityOffsetPlane.hidden = true;
                    entityOffsetPlane.Create();

                    var sketchDef = (ksSketchDefinition)entitySketch.GetDefinition();
                    if (sketchDef != null)
                    {
                        sketchDef.SetPlane(entityOffsetPlane);
                        entitySketch.Create();

                        var sketchEdit = (ksDocument2D)sketchDef.BeginEdit();

                        LineDraw(sketchEdit, data, sketchType);

                        sketchDef.EndEdit();
                        BlackKeyCut(part, entitySketch, data);
                    }
                }
            }
        }
예제 #11
0
        /// <summary>
        /// Метод выдавливания клавиш.
        /// </summary>
        /// <param name="part">Указатель на компонент.</param>
        /// <param name="entity">Указатель на эскиз.</param>
        private void KeyExtruse(ksPart part, ksEntity entity,
                                KeyboardParametersStorage data, bool isWhiteKey,
                                KeyLevel keyLevel = KeyLevel.Top)
        {
            var entityExtrusion = (ksEntity)part.NewEntity((short)Obj3dType.o3d_bossExtrusion);

            if (entityExtrusion != null)
            {
                var extrusionDefinition = (ksBossExtrusionDefinition)entityExtrusion.GetDefinition();
                if (extrusionDefinition != null)
                {
                    extrusionDefinition.directionType = (short)Direction_Type.dtNormal;
                    if (isWhiteKey)
                    {
                        entityExtrusion.name = "Выдавливание белых клавиш";
                        entityExtrusion.SetAdvancedColor(Color.FromArgb(254,
                                                                        254, 254).ToArgb(), .0, .0, .0, .0, 100, 100);

                        var keyLevelDictionary = new Dictionary <KeyLevel, double>()
                        {
                            { KeyLevel.Bottom, 1.5 },
                            { KeyLevel.Middle, data.KeyboardType == KeyboardType.Piano
                                                ? 2.0
                                                : 0.5 },
                            { KeyLevel.Top, 0.1 }
                        };
                        extrusionDefinition.SetSideParam(true,
                                                         (short)End_Type.etBlind,
                                                         keyLevelDictionary[keyLevel]);
                    }
                    else
                    {
                        entityExtrusion.name = "Выдавливание черных клавиш";
                        entityExtrusion.SetAdvancedColor(Color.FromArgb(20,
                                                                        20, 20).ToArgb(), .0, .0, .0, .0, 100, 100);
                        extrusionDefinition.SetSideParam(true,
                                                         (short)End_Type.etBlind, 3.4);
                    }
                    extrusionDefinition.SetThinParam(false, 0, 0, 0);
                    extrusionDefinition.SetSketch(entity);
                    entityExtrusion.Create();
                }
            }
        }
예제 #12
0
        /// <summary>
        /// Метод, устанавливающий начальную клавишу для клавиатуры.
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        private KeyNote SetCurrentNote(KeyboardParametersStorage data)
        {
            switch (data.KeyboardKeyAmount)
            {
            case 88:
            {
                return(KeyNote.A);
            }

            case 76:
            {
                return(KeyNote.A);
            }

            case 61:
            {
                return(KeyNote.C);
            }
            }
            throw new Exception();
        }
예제 #13
0
        /// <summary>
        /// Метод вырезания скоса у черных клавиш.
        /// </summary>
        /// <param name="part">Указатель на компонент.</param>
        /// <param name="entity">Указатель на эскиз.</param>
        /// <param name="data">Указатель на данные.</param>
        private void BlackKeyCut(ksPart part, ksEntity entity,
                                 KeyboardParametersStorage data)
        {
            var entityCut = (ksEntity)part.NewEntity((short)Obj3dType.o3d_cutExtrusion);

            if (entityCut != null)
            {
                entityCut.name = "Вырезание черных клавиш";
                var cutDefinition = (ksCutExtrusionDefinition)entityCut.GetDefinition();
                if (cutDefinition != null)
                {
                    cutDefinition.directionType = (short)Direction_Type.dtReverse;
                    cutDefinition.SetSideParam(false, (short)End_Type.etBlind,
                                               data.BoardLength - _space);
                    cutDefinition.SetSketch(entity);

                    entityCut.SetAdvancedColor(Color.FromArgb(20, 20, 20).ToArgb(),
                                               .0, .0, .0, .0, 100, 100);
                    entityCut.Create();
                }
            }
        }
예제 #14
0
        /// <summary>
        /// Метод, создающий тело клавиатуры.
        /// </summary>
        /// <param name="document3D"></param>
        /// <param name="data"></param>
        public override void Build(ksDocument3D document3D,
                                   KeyboardParametersStorage data)
        {
            if (document3D == null || data == null)
            {
                throw new NullReferenceException("Метод ссылается на null объект.");
            }
            part = (ksPart)document3D.GetPart((short)Part_Type.pTop_Part);
            if (part != null)
            {
                // НИЖНЯЯ часть тела клавиатуры.
                //
                var entitySketch = (ksEntity)part.NewEntity((short)Obj3dType.o3d_sketch);
                if (entitySketch != null)
                {
                    entitySketch.name = "Тело клавиатуры";

                    var sketchDef = (ksSketchDefinition)entitySketch.GetDefinition();
                    if (sketchDef != null)
                    {
                        var basePlane = (ksEntity)part.GetDefaultEntity((short)Obj3dType.o3d_planeXOY);

                        sketchDef.SetPlane(basePlane);
                        entitySketch.Create();

                        var sketchEdit = (ksDocument2D)sketchDef.BeginEdit();

                        sketchEdit.ksLineSeg(0, 0, 0, -data.BodyDepth, 1);
                        sketchEdit.ksLineSeg(0, -data.BodyDepth,
                                             -data.BodyLength, -data.BodyDepth, 1);
                        sketchEdit.ksLineSeg(-data.BodyLength,
                                             -data.BodyDepth, -data.BodyLength, 0, 1);
                        sketchEdit.ksLineSeg(-data.BodyLength, 0, 0, 0, 1);

                        sketchDef.EndEdit();
                        BodyExtruseBottom(data, entitySketch);
                    }
                }
                // ВЕРХНЯЯ часть тела клавиатуры.
                //
                var entityOffsetPlane = (ksEntity)part.NewEntity((short)Obj3dType.o3d_planeOffset);

                entitySketch = (ksEntity)part.NewEntity((short)Obj3dType.o3d_sketch);
                if (entityOffsetPlane != null)
                {
                    entitySketch.name = "Тело клавиатуры";

                    var offsetDef = (ksPlaneOffsetDefinition)entityOffsetPlane.GetDefinition();
                    if (offsetDef != null)
                    {
                        var basePlane = (ksEntity)part.GetDefaultEntity((short)Obj3dType.o3d_planeXOY);
                        basePlane.name = "Начальная плоскость";

                        offsetDef.direction = true;
                        offsetDef.offset    = data.BodyHeight - 3.5;
                        offsetDef.SetPlane(basePlane);

                        entityOffsetPlane.name   = "Смещенная плоскость";
                        entityOffsetPlane.hidden = true;
                        entityOffsetPlane.Create();

                        var sketchDef = (ksSketchDefinition)entitySketch.GetDefinition();
                        if (sketchDef != null)
                        {
                            sketchDef.SetPlane(entityOffsetPlane);
                            entitySketch.Create();

                            var sketchEdit = (ksDocument2D)sketchDef.BeginEdit();

                            sketchEdit.ksLineSeg(0, 0, 0, -data.BodyDepth,
                                                 1);
                            sketchEdit.ksLineSeg(0, -data.BodyDepth,
                                                 -data.BodyLength, -data.BodyDepth, 1);
                            sketchEdit.ksLineSeg(-data.BodyLength,
                                                 -data.BodyDepth, -data.BodyLength, 0, 1);
                            sketchEdit.ksLineSeg(-data.BodyLength, 0,
                                                 -(data.BodyLength / 2)
                                                 - (data.BoardLength / 2), 0, 1);
                            sketchEdit.ksLineSeg(-(data.BodyLength / 2)
                                                 - (data.BoardLength / 2), 0,
                                                 -(data.BodyLength / 2)
                                                 - (data.BoardLength / 2), -15.5, 1);
                            sketchEdit.ksLineSeg(-(data.BodyLength / 2)
                                                 - (data.BoardLength / 2), -15.5,
                                                 -(data.BodyLength / 2) + (data.BoardLength
                                                                           / 2), -15.5, 1);
                            sketchEdit.ksLineSeg(-(data.BodyLength / 2)
                                                 + (data.BoardLength / 2), -15.5,
                                                 -(data.BodyLength / 2) + (data.BoardLength
                                                                           / 2), 0, 1);
                            sketchEdit.ksLineSeg(-(data.BodyLength / 2)
                                                 + (data.BoardLength / 2), 0, 0, 0, 1);

                            sketchDef.EndEdit();
                            BodyExtruseTop(data, entitySketch);
                        }
                    }
                }
            }
        }
예제 #15
0
 /// <summary>
 /// Метод построения части клавиатуры.
 /// </summary>
 /// <param name="document3D"></param>
 /// <param name="data"></param>
 public abstract void Build(ksDocument3D document3D,
                            KeyboardParametersStorage data);
예제 #16
0
        /// <summary>
        /// Метод, строящий ручки.
        /// </summary>
        /// <param name="document3D"></param>
        /// <param name="data"></param>
        private void KnobsBuild(ksDocument3D document3D,
                                KeyboardParametersStorage data)
        {
            // Переменные центрования.
            //
            double horCenter = data.BodyLength / 2;
            double verCenter = data.BodyDepth - ((data.BodyDepth - 15.5)
                                                 / 2);

            // Переменные отступов.
            //
            double horMargin = horCenter - 10.0;
            double verMargin = verCenter + 3.0;

            part = (ksPart)document3D.GetPart((short)Part_Type.pTop_Part);

            var entityOffsetPlane = (ksEntity)part.NewEntity((short)Obj3dType.o3d_planeOffset);
            var entitySketch      = (ksEntity)part.NewEntity((short)Obj3dType.o3d_sketch);

            entitySketch.name = "Ручки";

            if (entityOffsetPlane != null)
            {
                var offsetDef = (ksPlaneOffsetDefinition)entityOffsetPlane.GetDefinition();
                if (offsetDef != null)
                {
                    var basePlane = (ksEntity)part.GetDefaultEntity((short)Obj3dType.o3d_planeXOY);

                    basePlane.name = "Начальная плоскость";

                    offsetDef.direction = true;
                    offsetDef.offset    = data.BodyHeight;
                    offsetDef.SetPlane(basePlane);

                    entityOffsetPlane.name   = "Смещенная плоскость";
                    entityOffsetPlane.hidden = true;
                    entityOffsetPlane.Create();

                    var sketchDef = (ksSketchDefinition)entitySketch.GetDefinition();
                    if (sketchDef != null)
                    {
                        sketchDef.SetPlane(entityOffsetPlane);

                        entitySketch.Create();

                        var sketchEdit = (ksDocument2D)sketchDef.BeginEdit();

                        for (int i = 0; i < 2; i++)
                        {
                            for (int j = 0; j < 8; j++)
                            {
                                sketchEdit.ksCircle(-horMargin + 0.25,
                                                    -verMargin + 0.25, 0.5, 1);

                                // Производим обновление горизонтального
                                // отступа для построения следующей
                                // ручки.
                                horMargin -= 3;
                            }
                            // Производим сброс горизонтального отступа
                            // и обновление вертикального отступа для
                            // построения следующего ряда ручек.
                            //
                            horMargin  = horCenter - 10.0;
                            verMargin -= 3.0;
                        }
                        sketchDef.EndEdit();
                        KnobsExtruse(part, entitySketch);
                    }
                }
            }
        }
예제 #17
0
        /// <summary>
        /// Метод, рисующий линии белой клавиши для эскиза.
        /// </summary>
        /// <param name="sketch">Указатель на эскиз.</param>
        /// <param name="data">Указатель на данные.</param>
        /// <param name="currentKey">Текущая клавиша.</param>
        /// <param name="count">Номер текущей клавиши.</param>
        /// <param name="marginFront">Фронтальный отступ.</param>
        private KeyCreatorBase KeyLineDraw(ksDocument2D sketch,
                                           KeyboardParametersStorage data, KeyNote currentKey, int count,
                                           double marginFront)
        {
            switch (currentKey)
            {
            case KeyNote.C:
            {
                if (count + 1 == data.WhiteKeyAmount)
                {
                    return(new KeyCreatorCAdditional(sketch,
                                                     _marginLeft, marginFront));
                }
                return(new KeyCreatorC(sketch, _marginLeft,
                                       marginFront));
            }

            case KeyNote.D:
            {
                return(new KeyCreatorD(sketch, _marginLeft,
                                       marginFront));
            }

            case KeyNote.E:
            {
                return(new KeyCreatorE(sketch, _marginLeft,
                                       marginFront));
            }

            case KeyNote.F:
            {
                return(new KeyCreatorF(sketch, _marginLeft,
                                       marginFront));
            }

            case KeyNote.G:
            {
                return(new KeyCreatorG(sketch, _marginLeft,
                                       marginFront));
            }

            case KeyNote.A:
            {
                if (count == 0)
                {
                    return(new KeyCreatorAAdditional(sketch,
                                                     _marginLeft, marginFront));
                }
                return(new KeyCreatorA(sketch, _marginLeft,
                                       marginFront));
            }

            case KeyNote.B:
            {
                return(new KeyCreatorB(sketch, _marginLeft,
                                       marginFront));
            }

            default:
            {
                throw new Exception("TODO");
            }
            }
        }
예제 #18
0
        void KeyBuild(ksDocument3D document3D,
                      KeyboardParametersStorage data, KeyNote currentKey)
        {
            switch (data.KeyboardType)
            {
            case KeyboardType.Piano:
            {
                KeyPartBuild(document3D, data, currentKey, true,
                             _keyboardHeight, KeyLevel.Middle);

                KeyPartBuild(document3D, data, currentKey, true, 1.5);

                // Если первая клавиша ДО (C), то первая черная клавиша -
                // РЕ -БЕМОЛЬ (Db).
                // Если первая клавиша ЛЯ (A), то первая черная клавиша -
                // СИ -БЕМОЛЬ (Bb).
                //
                if (currentKey == KeyNote.C)
                {
                    currentKey = KeyNote.Db;
                }
                else
                {
                    if (currentKey == KeyNote.A)
                    {
                        currentKey = KeyNote.Bb;
                    }
                }

                KeyPartBuild(document3D, data, currentKey, false,
                             _keyboardHeight);
                break;
            }

            case KeyboardType.Synth:
            {
                KeyPartBuild(document3D, data, currentKey, true,
                             _keyboardHeight, KeyLevel.Bottom);

                KeyPartBuild(document3D, data, currentKey, true, 2.0,
                             KeyLevel.Middle);

                KeyPartBuild(document3D, data, currentKey, true, 1.5);

                if (currentKey == KeyNote.C)
                {
                    currentKey = KeyNote.Db;
                }
                else
                {
                    if (currentKey == KeyNote.A)
                    {
                        currentKey = KeyNote.Bb;
                    }
                }

                KeyPartBuild(document3D, data, currentKey, false,
                             _keyboardHeight);
                break;
            }
            }
        }
예제 #19
0
        /// <summary>
        /// Метод, рисующий эскиз клавиш.
        /// </summary>
        /// <param name="document3D">Указатель на активный документ КОМПАС-3D.</param>
        /// <param name="data">Указатель на данные.</param>
        /// <param name="currentKey">Текущая клавиша.</param>
        /// <param name="isWhiteKey">Принадлежность к белым клавишам.</param>
        /// <param name="keyboardHeight">Высота клавиатурной секции.</param>
        /// <param name="keyLevel">Уровень клавиши.</param>
        private void KeyPartBuild(ksDocument3D document3D,
                                  KeyboardParametersStorage data, KeyNote currentKey,
                                  bool isWhiteKey, double keyboardHeight,
                                  KeyLevel keyLevel = KeyLevel.Top)
        {
            // Установка фронтального отступа в зависимости от выбранного
            // уровня клавиш.
            //
            double marginTop;

            var keyMarginTopDictionary = new Dictionary <KeyLevel, double>()
            {
                { KeyLevel.Bottom, 3.6 },
                { KeyLevel.Middle, 0.6 },
                { KeyLevel.Top, 0.5 }
            };

            marginTop = keyMarginTopDictionary[keyLevel];

            // Сброс отступа.
            _marginLeft = -(data.BodyLength / 2) + (data.BoardLength / 2)
                          - _space;

            part = (ksPart)document3D.GetPart((short)Part_Type.pTop_Part);
            var entityOffsetPlane = (ksEntity)part.NewEntity((short)Obj3dType.o3d_planeOffset);
            var entitySketch      = (ksEntity)part.NewEntity((short)Obj3dType.o3d_sketch);

            if (entityOffsetPlane != null)
            {
                var offsetDef = (ksPlaneOffsetDefinition)entityOffsetPlane.GetDefinition();
                if (offsetDef != null)
                {
                    offsetDef.direction = true;
                    offsetDef.offset    = data.BodyHeight - keyboardHeight;

                    var basePlane = (ksEntity)part.GetDefaultEntity((short)Obj3dType.o3d_planeXOY);
                    basePlane.name = "Начальная плоскость";
                    offsetDef.SetPlane(basePlane);

                    entityOffsetPlane.name   = "Смещенная плоскость";
                    entityOffsetPlane.hidden = true;
                    entityOffsetPlane.Create();
                    var sketchDef = (ksSketchDefinition)entitySketch.GetDefinition();
                    if (sketchDef != null)
                    {
                        sketchDef.SetPlane(entityOffsetPlane);
                        entitySketch.Create();
                        var sketchEdit = (ksDocument2D)sketchDef.BeginEdit();

                        if (isWhiteKey)
                        {
                            entitySketch.name = "Белые клавиши";
                            for (int count = 0; count < data.WhiteKeyAmount;
                                 count++)
                            {
                                KeyLineDraw(sketchEdit, data, currentKey,
                                            count, marginTop).Build();
                                _marginLeft = _marginLeft - 2.2 - _space;

                                // Сброс последовательности клавиш.
                                //
                                if (currentKey == KeyNote.B)
                                {
                                    currentKey = KeyNote.C;
                                }
                                else
                                {
                                    currentKey++;
                                }
                            }
                        }
                        else
                        {
                            entitySketch.name = "Черные клавиши";
                            for (int count = 0; count < data.BlackKeyAmount;
                                 count++)
                            {
                                // Для ровного отображения черных клавиш
                                // относительно белых, необходимо задать
                                // отступ после каждой клавиши.
                                //
                                if (count == 0 && currentKey == KeyNote.Db)
                                {
                                    _marginLeft = _marginLeft - 2.2 - _space;
                                }
                                else if (currentKey == KeyNote.Db ||
                                         currentKey == KeyNote.Gb)
                                {
                                    _marginLeft = _marginLeft - (2.2
                                                                 + _space) * 2;
                                }
                                else
                                {
                                    _marginLeft = _marginLeft - 2.2
                                                  - _space;
                                }
                                KeyLineDraw(sketchEdit, currentKey).Build();

                                // Следующей после СИ-БЕМОЛЬ черной клавишей
                                // является РЕ-БЕМОЛЬ.
                                //
                                if (currentKey == KeyNote.Bb)
                                {
                                    currentKey = KeyNote.Db;
                                }
                                else
                                {
                                    currentKey++;
                                }
                            }
                        }
                        sketchDef.EndEdit();
                        if (isWhiteKey)
                        {
                            KeyExtruse(part, entitySketch, data,
                                       isWhiteKey, keyLevel);
                        }
                        else
                        {
                            KeyExtruse(part, entitySketch, data,
                                       isWhiteKey);
                            BlackKeyCutSketch(document3D, data);
                        }
                    }
                }
            }
        }