YSRESULT YsShellExtEdit_CutByPlane::CutByPolygon(YsShellExtEdit &shl,YSSIZE_T np,const YsShellVertexHandle p[]) { YsArray <YsVec3,16> vtPos(np,NULL); for(YSSIZE_T idx=0; idx<np; ++idx) { shl.GetVertexPosition(vtPos[idx],p[idx]); } return CutByPolygon(shl,vtPos); }
static void turnoutCmd(char address, char cmd, TurnoutTable *turnout_state) { int i = 0, row = 0, col = 0; if (address >= 1 && address <= 18) { i = address - 1; row = i / 3 + 1; col = 9 * (i % 3) + 8; } else if (address >= 153 && address <= 156) { i = address - 135; row = 8; col = 9 * (address - 153) + 8; } else { assert(0); } int mask = 1 << i; char *colour; char rep; // don't repeat commands if (cmd == CURVE) { if ((*turnout_state & mask) == 0) { colour = YELLOW; rep = 'C'; *turnout_state |= mask; } else { return; } } else if (cmd == STRAIGHT) { if ((*turnout_state & mask) == 0) { return; } else { colour = GREEN; rep = 'S'; *turnout_state &= ~mask; } } else { assert(0); } struct String s; sinit(&s); sputc(&s, cmd); sputc(&s, address); sputc(&s, CLEAR_SOLENOID); tioPrint(&s); sinit(&s); sputstr(&s, CURSOR_SAVE); vtPos(&s, SWITCH_ROW + row, col); sputstr(&s, colour); sputc(&s, rep); sputstr(&s, RESET); sputstr(&s, CURSOR_RESTORE); mioPrint(&s); }
static void turnoutServer(void) { const char *rows[] = { "+--------+--------+--------+", "| 1: # | 2: # | 3: # |", "| 4: # | 5: # | 6: # |", "| 7: # | 8: # | 9: # |", "| 10: # | 11: # | 12: # |", "| 13: # | 14: # | 15: # |", "| 16: # | 17: # | 18: # |", "+--------+--------+--------+--------+", "| 153: # | 154: # | 155: # | 156: # |", "+--------+--------+--------+--------+" }; struct String s; for (unsigned int i = 0; i < sizeof(rows) / sizeof(rows[0]); i++) { sinit(&s); sputstr(&s, CURSOR_SAVE); vtPos(&s, SWITCH_ROW + i, 1); sputstr(&s, rows[i]); sputstr(&s, CURSOR_RESTORE); mioPrint(&s); } // set to all zeros (straight) so curve commands actually get sent TurnoutTable turnout_state = 0; for (int i = 1; i <= 18; ++i) { turnoutCmd(i, CURVE, &turnout_state); } for (int i = 153; i <= 156; ++i) { turnoutCmd(i, CURVE, &turnout_state); } bool quit = false; int tid; struct TurnoutMessage request; while (!quit) { int len = Receive(&tid, (char *) &request, sizeof(struct TurnoutMessage)); assert(len == sizeof(struct TurnoutMessage)); switch (request.cmd) { case CMD_TURNOUT_STRAIGHT: turnoutCmd(request.address, STRAIGHT, &turnout_state); break; case CMD_TURNOUT_CURVE: turnoutCmd(request.address, CURVE, &turnout_state); break; case CMD_TURNOUT_QUERY: // already responded break; case CMD_TURNOUT_QUIT: quit = true; break; } Reply(tid, (char *) &turnout_state, sizeof(int)); } Exit(); }