Фэндом


Главная | Описание языка | FXD | API | Примеры | Инструменты Разработки | Новости | Ресурсы | Форум


JavaFX Электронный Симулятор Править

Electronic simulator off.png Electronic simulator on.png

Описание Править

Данная программа позволяет описать на языке JavaFX Script электрическую схему


Код программы Править

import javafx.ext.swing.*;
import javafx.animation.*;
import javafx.scene.input.*;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.paint.*;
import javafx.scene.shape.*;
import java.lang.System;


function abs(x: Number):Number{
    return if ( x < 0 ) then -x else x;
}

function min(x: Number, y: Number):Number{
    return if ( x < y ) then x else y;
}

//  ============  XY  ====================//

class XY{
    var x: Number = 0; // on replace{ System.out.println("[xy] x: {x}")};
    var y: Number = 0; // on replace{ System.out.println("[xy] y: {y}")};
}

//  ============  Pin  ====================//

class Pin extends CustomNode{
    var pos: XY;
    var level: Number;

    override function create():Node{
      return Group{
        content: [ Circle{
            centerX: bind pos.x
            centerY: bind pos.y
            radius: 4
            fill: Color.BLUE
        }]
      };
    }

}


//  ============  ElectroScheme  ====================//

class ElectroScheme{

    var components: ElectronicComponent[];

    public function simulate(){
      for(comp in components){
        comp.simulate();
      }
    }

}

//  ============  ElectronicComponent  ====================//

abstract class ElectronicComponent extends CustomNode{

    var name: String;

    var pos: XY;
    var compWidth:  Number = 20.0;
    var compHeight: Number = 15.0;

    var pin1: Pin;
    var pin2: Pin;

    abstract function simulate():Void;

    function switchLevels(){
      var level = pin1.level;
      pin1.level = pin2.level;
      pin2.level = level;
    }

}

//  ============  Wire ====================//


class Wire extends ElectronicComponent{
    init {
        name = "Wire";
        pin1 = Pin{};
        pin2 = Pin{};
    }

    override function create():Node{
      return Group{
        content: [ Line{
            startX: bind pin1.pos.x
            startY: bind pin1.pos.y
            endX: bind pin2.pos.x
            endY: bind pin2.pos.y
            stroke: Color.GREEN
        }]
      };
    }

   override function simulate():Void{
      switchLevels();
   }


}



//  ============  Lamp ====================//


class Lamp extends ElectronicComponent{

    var switchOn: Boolean = false;
    override var pin1 on replace oldPin=newPin {
       pin1.pos = XY{x: bind pos.x - compWidth / 2  y: bind pos.y + 2 * compHeight -5};
    }

    override var pin2 on replace oldPin=newPin {
      pin2.pos = XY{x: bind pos.x + compWidth / 2  y: bind pos.y + 2 * compHeight - 5};
    }

    init {
        name = "Lamp";
    }

    override function simulate():Void{
      if( abs( pin1.level - pin2.level) > 5 ){
        switchOn = true;
      }else{
        switchOn = false;
      }
     switchLevels();
    }

    override function create(): Node{
      var r = min(compWidth, compHeight);
      var h = r / 2.0;

      return Group{
        content: [Rectangle{
            x: bind pos.x - h
            y: bind pos.y
            width: r
            height: 2* r
            fill: Color.SILVER
        }, Circle{
            centerX: bind pos.x
            centerY: bind pos.y
            radius: r
            fill: bind if (switchOn) then Color.RED else Color.GREY
        }, pin1, pin2 ]
        onMouseDragged: function (e: MouseEvent){
            pos.x = e.x; 
            pos.y = e.y; 
         }
      };
    }


}



//  ============  Battery ====================//


class Battery extends  ElectronicComponent {

    override var pin1 on replace oldPin=newPin {
       pin1.pos = XY {x: bind pos.x + compWidth - 5  y: bind pos.y - compHeight};
    }

    override var pin2 on replace oldPin=newPin {
      pin2.pos = XY{x: bind pos.x - compWidth + 5  y: bind pos.y - compHeight};
    }

    init {
        name = "Battery";
    }


    override function simulate():Void{
      pin1.level =  3.0;
      pin2.level = -3.0;
    }

    override function create():Node{
      var w = compWidth;
      var h = compHeight;

      return Group{
        content: [Rectangle{
            x: bind pos.x - w
            y: bind pos.y - h
            width:  2 * w
            height: 2 * h
            fill: Color.CHOCOLATE
            stroke: Color.BROWN
        },Line{
            startX: bind pos.x + w - 5 + 3
            startY: bind pos.y - h + 10
            endX: bind pos.x + w - 5 - 3
            endY: bind pos.y - h  + 10

            stroke: Color.DARKBLUE
            strokeWidth: 2
        },Line{
            startX: bind pos.x - w + 5 + 3
            startY: bind pos.y - h + 10
            endX: bind pos.x - w  + 5 - 3
            endY: bind pos.y - h  + 10

            stroke: Color.DARKBLUE
            strokeWidth: 2
        },Line{
            startX: bind pos.x - w + 5
            startY: bind pos.y - h + 10 + 3
            endX: bind pos.x - w  + 5
            endY: bind pos.y - h  + 10 -3

            stroke: Color.DARKBLUE
            strokeWidth: 2
        },pin1, pin2]
         onMouseDragged: function(e: MouseEvent){
            pos.x = e.x; 
            pos.y = e.y; 
         }
      };
    }

}


//  ============  Switch ====================//




class Switch extends ElectronicComponent{
    var switchOn: Boolean = false;
    override var pin1 on replace oldPin=newPin {
        pin1.pos = XY{x: bind pos.x + compWidth   y: bind pos.y };
    }
    override var pin2 on replace oldPin=newPin {
        pin2.pos = XY{x: bind pos.x - compWidth   y: bind pos.y };
    }

    init {
        name = "Switch";
    }

    override function simulate():Void{
      if(switchOn){
        switchLevels();
      }
    }

    override function create(): Node{
      return Group{
        content:  [ Circle{
            centerX: bind pos.x
            centerY: bind pos.y
            radius:  min(compWidth, compHeight)
            fill: Color.ORANGE
            stroke: Color.BROWN
            onMouseClicked: function(e){
                switchOn = not switchOn;
            }
            onMouseDragged: function(e:MouseEvent){
                pos.x = e.x; 
                pos.y = e.y; 
            }
        }, Group{
            content: bind if (switchOn) then Line{
              startX: bind pos.x - compWidth
              startY: bind pos.y
              endX: bind pos.x + compWidth
              endY: bind pos.y
              stroke: Color.BROWN
              strokeWidth: 2
          } else Line{
              startX: bind pos.x - compWidth / 1.7
              startY: bind pos.y + compHeight /1.7
              endX: bind pos.x + compWidth / 1.7
              endY: bind pos.y - compHeight /1.7
              stroke: Color.BROWN
              strokeWidth: 2
          }
        } ,pin1, pin2]

      };
    }

}

var scheme = ElectroScheme{
    var wire1 = Wire{}
    var wire2 = Wire{}
    var wire3 = Wire{}

    components:[
    Lamp{
        pos: XY{ x: 160  y: 25}
        pin1: wire1.pin2
        pin2: wire3.pin1
    },
    Battery{
        pos: XY{ x: 100  y: 120}
        pin1: wire2.pin2
        pin2: wire1.pin1
    },Switch{
        pos: XY{ x: 180  y: 105}
        pin1: wire3.pin2
        pin2: wire2.pin1

    },

    wire1, wire2, wire3 ]
};


var timeline = Timeline {
    keyFrames:  KeyFrame {
        time: 0.02s
        action: function() { scheme.simulate(); }
    }
    repeatCount: Timeline.INDEFINITE
}

timeline.play();


Stage {
    title: "Simple Electro Simulator"
    width: 300
    height: 200
    scene: Scene{
        content: bind [ scheme.components ]
    }
}

Обнаружено использование расширения AdBlock.


Викия — это свободный ресурс, который существует и развивается за счёт рекламы. Для блокирующих рекламу пользователей мы предоставляем модифицированную версию сайта.

Викия не будет доступна для последующих модификаций. Если вы желаете продолжать работать со страницей, то, пожалуйста, отключите расширение для блокировки рекламы.

Также на Фэндоме

Случайная вики