Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- V tm 0 0.1 # соединение с ТМ
- V mk 0 0.1 # МК
- C tm mk 7mm
- # КДР
- V kdr 0 1
- C mk_kdr mk kdr 3.5mm 0
- C kdr_at kdr at 1mm 0
- # срывной клапан
- V sk 0 0.01
- C mk_sk mk sk 0.8mm 0
- C sk_tc sk tc 6mm 0
- C mk_at_sk tm at 16mm 0
- # МК - ЗК - ЗР
- V zk 0 0.4
- V zr 0 0.4
- C mk_zk mk zk 1 0
- C zk zr 9mm
- # ТЦ
- V tc 0 0.4
- C zk_tc zk tc 4mm 0 # ЗК - ТЦ (служебное)
- C tc_at tc at 1 0 # ТЦ - Ат (отпуск)
- C zk_tc_e zk tc 1 0 # ЗК - ТЦ (экстренное)
- */
- include "splibrary.gs"
- class SPAO_VR292 isclass SPAirObject
- {
- define public int ModeK = 0;
- define public int ModeD = 1;
- define public int ModeUV = 2;
- public int Mode = ModeD;
- int vTM;
- int vMK;
- int cMK_KDR;
- int cKDR_AT;
- int vSK;
- int cMK_SK;
- int cSK_TC;
- int cMK_AT_SK;
- int cMK_ZK;
- int vZK;
- int vTC;
- int cZK_TC;
- int cTC_AT;
- int cZK_TC_E;
- public float OZX = 6.0f;
- public float GZX = 6.0f;
- public float OZFriction = 5.0f;
- public float GZFriction = 16.0f;
- define float OZIdleFriction = 5.0f;
- define float OZMovingFriction = 2.0f;
- define float GZIdleFriction = 16.0f;
- define float GZMovingFriction = 8.0f;
- define float OZSpeed = 5.0f;
- define float OZGZSpeed = 2.0f;
- define float OZLeftBufferForce = 80.0f;
- define float OZLeftBuffer = 3.0f;
- define float OZRightBufferForce = 15.0f;
- define float OZRightBuffer = 17.5f;
- define float SKChargePressure = 20.0f;
- define float SKInitialOpenPressure = 110.0f;
- define float SKFullPressure = 20.0f;
- define float SKRatio = 2.0f;
- public void Init(SPAirScheme scheme)
- {
- inherited(scheme);
- vTM = scheme.GetNodeId("tm");
- vMK = scheme.GetNodeId("mk");
- cMK_KDR = scheme.GetLinkId("mk_kdr");
- cKDR_AT = scheme.GetLinkId("kdr_at");
- vSK = scheme.GetNodeId("sk");
- cMK_SK = scheme.GetLinkId("mk_sk");
- cSK_TC = scheme.GetLinkId("sk_tc");
- cMK_AT_SK = scheme.GetLinkId("mk_at_sk");
- cMK_ZK = scheme.GetLinkId("mk_zk");
- vZK = scheme.GetNodeId("zk");
- vTC = scheme.GetNodeId("tc");
- cZK_TC = scheme.GetLinkId("zk_tc");
- cTC_AT = scheme.GetLinkId("tc_at");
- cZK_TC_E = scheme.GetLinkId("zk_tc_e");
- }
- public void Update(float dt)
- {
- float openMK_KDR = 0.0f;
- float openKDR_AT = 0.0f;
- float openMK_SK = 0.0f;
- float openSK_TC = 0.0f;
- float openMK_AT_SK = 0.0f;
- float openMK_ZK = 0.0f;
- float openZK_TC = 0.0f;
- float openTC_AT = 0.0f;
- float openZK_TC_E = 0.0f;
- // updating holes
- float ozgz_x = OZX - GZX;
- bool hole_a1_kdr = ozgz_x < 4.0;
- bool hole_t_zk = 3.5 < ozgz_x;
- bool hole_s_mk = 5.0 < ozgz_x;
- bool hole_mk_zk_3d175 = 1.0 < OZX and OZX < 4.0;
- bool hole_mk_zk_d200 = OZX <= 1.0;
- bool hole_tc3_t = 5.5 < GZX and GZX < 11.0;
- bool hole_tc3_sk = 12.0 <= GZX;
- bool hole_tc2_at = 0.0 <= GZX and GZX < 5.0;
- bool hole_a1_at = 0.0 <= GZX and GZX < 5.0;
- bool hole_kdr_s = 0.0 <= GZX and GZX <= 10.0;
- bool hole_tc_e = 15.0 <= GZX;
- bool hole_kdr_at_o = 11.0 <= GZX;
- float tmPressure = scheme.GetPressure(vTM);
- float mkPressure = scheme.GetPressure(vMK);
- float skPressure = scheme.GetPressure(vSK);
- float zkPressure = scheme.GetPressure(vZK);
- float tcPressure = scheme.GetPressure(vTC);
- // updating air flow through holes)
- if (hole_tc3_sk and Mode != ModeUV)
- openSK_TC = 1.0f;
- float skPressureDelta = tmPressure - (skPressure + SKRatio * tcPressure);
- if (skPressureDelta > SKChargePressure) {
- openMK_SK = 1.0f;
- if (skPressureDelta > SKInitialOpenPressure) {
- openMK_AT_SK = (skPressureDelta - SKInitialOpenPressure) / SKFullPressure;
- if (openMK_AT_SK > 1.0f)
- openMK_AT_SK = 1.0f;
- }
- }
- if (hole_tc_e) {
- if (Mode == ModeK)
- openZK_TC_E = SPHelper.Hole(5.5f);
- else
- openZK_TC_E = SPHelper.Hole(2.5f);
- }
- if (hole_mk_zk_3d175)
- openMK_ZK = SPHelper.Hole(3 * 1.25f);
- else if (hole_mk_zk_d200)
- openMK_ZK = SPHelper.Hole(2.0f);
- if (hole_tc2_at) {
- if (Mode == ModeK)
- openTC_AT = SPHelper.Hole(3.0f);
- else
- openTC_AT = SPHelper.Hole(2.5f);
- }
- if (hole_t_zk and hole_tc3_t)
- openZK_TC = (ozgz_x - 3.5f) / 4.0f;
- if (hole_s_mk and hole_kdr_s)
- openMK_KDR = 1.0f;
- if (hole_a1_at and hole_a1_kdr or hole_kdr_at_o)
- openKDR_AT = 1.0f;
- // setting holes
- scheme.SetFlowRate(cMK_KDR, openMK_KDR);
- scheme.SetFlowRate(cKDR_AT, openKDR_AT);
- scheme.SetFlowRate(cMK_SK, openMK_SK);
- scheme.SetFlowRate(cSK_TC, openSK_TC);
- scheme.SetFlowRate(cMK_AT_SK, openMK_AT_SK);
- scheme.SetFlowRate(cMK_ZK, openMK_ZK);
- scheme.SetFlowRate(cZK_TC, openZK_TC);
- scheme.SetFlowRate(cTC_AT, openTC_AT);
- scheme.SetFlowRate(cZK_TC_E, openZK_TC_E);
- // updating positions
- float ozDelta = zkPressure - mkPressure;
- if (ozDelta > OZFriction)
- ozDelta = ozDelta - OZFriction;
- else if (ozDelta < -OZFriction)
- ozDelta = ozDelta + OZFriction;
- else
- ozDelta = 0.0f;
- float zSpeed = OZSpeed;
- float ozxNew = OZX + ozDelta * OZSpeed * dt;
- // collsion between oz and gz
- float ozMax = GZX + 7.5f;
- if (ozxNew < GZX or ozxNew > ozMax) {
- zSpeed = OZGZSpeed;
- if (ozDelta > GZFriction) {
- ozDelta = ozDelta - GZFriction;
- ozxNew = OZX + ozDelta * OZGZSpeed * dt;
- if (ozxNew < ozMax)
- ozxNew = ozMax;
- }
- else if (ozDelta < -GZFriction) {
- ozDelta = ozDelta + GZFriction;
- ozxNew = OZX + ozDelta * OZGZSpeed * dt;
- if (ozxNew > GZX)
- ozxNew = GZX;
- }
- else {
- ozDelta = 0.0f;
- if (ozxNew > ozMax)
- ozxNew = ozMax;
- else if (ozxNew < GZX)
- ozxNew = GZX;
- }
- }
- if (ozxNew < OZLeftBuffer) {
- ozxNew = OZLeftBuffer;
- if (ozDelta < -OZLeftBufferForce) {
- ozxNew = OZX + (ozDelta + OZLeftBufferForce) * zSpeed * dt;
- if (ozxNew > OZLeftBuffer)
- ozxNew = OZLeftBuffer;
- else if (ozxNew < 0.0f)
- ozxNew = 0.0f;
- }
- }
- else if (ozxNew > OZRightBuffer) {
- ozxNew = OZRightBuffer;
- if (ozDelta > OZRightBufferForce) {
- ozxNew = OZX + (ozDelta - OZRightBufferForce) * zSpeed * dt;
- if (ozxNew < OZRightBuffer)
- ozxNew = OZRightBuffer;
- else if (ozxNew > 24.0f)
- ozxNew = 24.0f;
- }
- }
- GZFriction = GZIdleFriction;
- if (ozxNew > ozMax) {
- GZX = ozxNew - 7.5f;
- GZFriction = GZMovingFriction;
- }
- else if (ozxNew < GZX) {
- GZX = ozxNew;
- GZFriction = GZMovingFriction;
- }
- OZFriction = OZIdleFriction;
- if (ozxNew != OZX) {
- OZFriction = OZMovingFriction;
- OZX = ozxNew;
- }
- }
- public Soup GetProperties()
- {
- Soup sp = inherited();
- sp.SetNamedTag("mode", Mode);
- sp.SetNamedTag("OZX", OZX);
- sp.SetNamedTag("GZX", GZX);
- sp.SetNamedTag("oz-friction", OZFriction);
- sp.SetNamedTag("gz-friction", GZFriction);
- return sp;
- }
- public void SetProperties(Soup sp)
- {
- inherited(sp);
- Mode = sp.GetNamedTagAsInt("mode", Mode);
- OZX = SPHelper.GetFloat(sp, "OZX", OZX);
- GZX = SPHelper.GetFloat(sp, "GZX", GZX);
- OZFriction = SPHelper.GetFloat(sp, "oz-friction", OZFriction);
- GZFriction = SPHelper.GetFloat(sp, "gz-friction", GZFriction);
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement