/// <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); } }
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; } } }
/// <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(); } } }
/// <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); } } } }
/// <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); }
/// <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); } } } }
/// <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); }
/// <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); }
/// <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); } } } }
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); } } } }
/// <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(); } } }
/// <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(); }
/// <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(); } } }
/// <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); } } } } }
/// <summary> /// Метод построения части клавиатуры. /// </summary> /// <param name="document3D"></param> /// <param name="data"></param> public abstract void Build(ksDocument3D document3D, KeyboardParametersStorage data);
/// <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); } } } }
/// <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"); } } }
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; } } }
/// <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); } } } } }