Sidebar.Geometry.LatheGeometry.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /**
  2. * @author rfm1201
  3. */
  4. Sidebar.Geometry.LatheGeometry = function( editor, object ) {
  5. var signals = editor.signals;
  6. var container = new UI.Row();
  7. var parameters = object.geometry.parameters;
  8. // segments
  9. var segmentsRow = new UI.Row();
  10. var segments = new UI.Integer( parameters.segments ).onChange( update );
  11. segmentsRow.add( new UI.Text( 'Segments' ).setWidth( '90px' ) );
  12. segmentsRow.add( segments );
  13. container.add( segmentsRow );
  14. // phiStart
  15. var phiStartRow = new UI.Row();
  16. var phiStart = new UI.Number( parameters.phiStart * 180 / Math.PI ).onChange( update );
  17. phiStartRow.add( new UI.Text( 'Phi start (°)' ).setWidth( '90px' ) );
  18. phiStartRow.add( phiStart );
  19. container.add( phiStartRow );
  20. // phiLength
  21. var phiLengthRow = new UI.Row();
  22. var phiLength = new UI.Number( parameters.phiLength * 180 / Math.PI ).onChange( update );
  23. phiLengthRow.add( new UI.Text( 'Phi length (°)' ).setWidth( '90px' ) );
  24. phiLengthRow.add( phiLength );
  25. container.add( phiLengthRow );
  26. // points
  27. var lastPointIdx = 0;
  28. var pointsUI = [];
  29. var pointsDiv = new UI.Div();
  30. var point;
  31. for ( var i = 0; i < parameters.points.length; i ++ ) {
  32. point = parameters.points[ i ];
  33. pointsDiv.add( createPointRow( point.x, point.z ) );
  34. }
  35. var pointsRow = new UI.Row().setDisplay( 'flex' );
  36. var btnAdd = new UI.Button( '+' ).setMarginRight( '15px' ).onClick( function() {
  37. pointsDiv.add( createPointRow( 0, 0 ) );
  38. update();
  39. } );
  40. pointsRow.add( new UI.Text( 'Points' ).setWidth( '50px' ), btnAdd, pointsDiv );
  41. container.add( pointsRow );
  42. //
  43. function createPointRow( x, y ) {
  44. var pointRow = new UI.Row();
  45. var lbl = new UI.Text( lastPointIdx + 1 ).setWidth( '20px' );
  46. var txtX = new UI.Number( x ).setRange( 0, Infinity ).setWidth( '40px' ).onChange( update );
  47. var txtY = new UI.Number( y ).setWidth( '40px' ).onChange( update );
  48. var idx = lastPointIdx;
  49. var btn = new UI.Button( '-' ).onClick( function() {
  50. deletePointRow( idx );
  51. } );
  52. pointsUI.push( { row: pointRow, lbl: lbl, x: txtX, y: txtY } );
  53. lastPointIdx ++;
  54. pointRow.add( lbl, txtX, txtY, btn );
  55. return pointRow;
  56. }
  57. function deletePointRow( idx ) {
  58. if ( ! pointsUI[ idx ] ) return;
  59. pointsDiv.remove( pointsUI[ idx ].row );
  60. pointsUI[ idx ] = null;
  61. update();
  62. }
  63. function update() {
  64. var points = [];
  65. var count = 0;
  66. var pointUI;
  67. for ( var i = 0; i < pointsUI.length; i ++ ) {
  68. pointUI = pointsUI[ i ];
  69. if ( ! pointUI ) {
  70. continue;
  71. }
  72. points.push( new THREE.Vector3( pointUI.x.getValue(), 0, pointUI.y.getValue() ) );
  73. count ++;
  74. pointUI.lbl.setValue( count );
  75. }
  76. editor.execute( new SetGeometryCommand( object, new THREE.LatheGeometry(
  77. points,
  78. segments.getValue(),
  79. phiStart.getValue() / 180 * Math.PI,
  80. phiLength.getValue() / 180 * Math.PI
  81. ) ) );
  82. }
  83. return container;
  84. }