phetsims / charges-and-fields

"Charges And Fields" is an educational simulation in HTML5, by PhET Interactive Simulations.
GNU General Public License v3.0
9 stars 7 forks source link

branch: phet-io-groups #170

Closed samreid closed 4 years ago

samreid commented 4 years ago

UPDATE FROM MK: this work extends from https://github.com/phetsims/phet-io/issues/1454. Hopefully we can get dynamic Groups working in Charges And Fields. We will work on a branch while we prototype.

zepumph commented 4 years ago

@samreid mentioned that there was some trouble with ordering while setting the state involving the equipotential lines. I would really like to know why (if?) the new Group strategy causes this error when the old one doesn't.

samreid commented 4 years ago

I have the same question!

chrisklus commented 4 years ago

After the above commit, we are able to drag out one electric field sensor which correctly propagates its state.

Remaining work to do for Group and its usage in this sim:

    static toStateObject( electricFieldSensorNode ) {
      validate( electricFieldSensorNode, this.validator );
      return {
        sensorPhetioID: electricFieldSensorNode.modelElement.tandem.phetioID
      };
    }
const electricFieldSensor = phet.phetIo.phetioEngine.getPhetioObject( stateObject.sensorPhetioID );

Maybe this:

defaultState: {
            sensorPhetioID: model.electricFieldSensors.prototypes.prototype.tandem.phetioID
          }

and the last part of

const electricFieldSensorNode = electricFieldSensorNodes.createNextCorrespondingGroupMember( addedElectricFieldSensor, { sensorPhetioID: addedElectricFieldSensor.tandem.phetioID } );
zepumph commented 4 years ago

Today we made more good progress here. We refactored Group quite a bit. Instead of create having a stateObject, parameter, we made it support var args that can be passed through createGroupMember. This is nice because it focuses Group.js more on phet core sim code, and less on the state engine usage of it. To support state we made a stateObjectToArgs method on IOTypes that can be used to map objects from toStateObject over to the args needed in create. We will see how this goes long term, but I'm happy for the focus shift away from state. I think it makes Group easier to grok.

Though this issue is mainly about CAF, tandem is still on master, and the Group updates effected phet-io-test-sim, so I updated those usages for this commit too.

chrisklus commented 4 years ago

@samreid, @zepumph, and I thought about moving stateObjectToArgs from the IO type to where Group is instantiated, but it didn't work smoothly with IO type inheritance. We are going to investigate a mixin solution over in https://github.com/phetsims/tandem/issues/105.

samreid commented 4 years ago

We worked on this more today, next steps will be moving to master. Do we need to fix the pencil button error first?

samreid commented 4 years ago
samreid commented 4 years ago
samreid commented 4 years ago

We made progress by making it so that ElectricPotentialLine doesn't error out if there are no charges:

```diff Index: js/charges-and-fields/model/ChargesAndFieldsModel.js IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- js/charges-and-fields/model/ChargesAndFieldsModel.js (revision 9491acdf33f51be5f0cdb19015daa215828852e8) +++ js/charges-and-fields/model/ChargesAndFieldsModel.js (date 1569001722745) @@ -180,10 +180,72 @@ // observable array that contains the model of electricPotential line, each element is an electricPotential line // @public read-only - this.electricPotentialLines = new ObservableArray( { + this.electricPotentialLines = new Group( 'electricPotentialLine', { + prototype: { + create: ( tandem, prototypeName, position ) => { + + assert && assert( position instanceof Vector2, 'position should be Vector2' ); + assert && assert( tandem instanceof Tandem, 'tandem should be a Tandem' ); + + // Do not try to add an equipotential line if there are no charges. + + // if ( !this.isPlayAreaChargedProperty.get() ) { + // return new PhetioObject(); + // } + // assert && assert( !this.isPlayAreaChargedProperty.get() ); + // if ( !this.isPlayAreaChargedProperty.get() ) { + // return; + // } + + // If we are too close to a charged particle, also bail out. + const isTooCloseToParticle = _.some( _.map( this.activeChargedParticles.getArray(), chargedParticle => { + // in model coordinates, should be less than the radius (in the view) of a charged particle + return chargedParticle.positionProperty.get().distance( position ) < 0.03; + } ) ); + if ( isTooCloseToParticle ) { + return; + } + + const electricPotentialLine = new ElectricPotentialLine( + position, + this.enlargedBounds, + this.activeChargedParticles, + this.getElectricPotential.bind( this ), + this.getElectricField.bind( this ), + this.isPlayAreaChargedProperty, + tandem + ); + + // this.electricPotentialLines.push( electricPotentialLine ); + + return electricPotentialLine; // for chaining and for PhET-iO restore state + }, + defaultArguments: [ this.electricPotentialSensor.positionProperty.get() ] + } + }, { tandem: tandem.createTandem( 'electricPotentialLines' ), - phetioType: ObservableArrayIO( ElectricPotentialLineIO ) - } ); // {ObservableArray.} + phetioType: GroupIO( ElectricPotentialLineIO ) + } ); + + // Observable array of all draggable electric charges + // @public {ObservableArray.} + // this.chargedParticles = new Group( 'particle', { + // prototype: { + // create: ( tandem, prototypeName, charge, initialPosition ) => { + // const chargedParticle = new ChargedParticle( charge, { + // tandem: tandem, + // phetioDynamicElement: true, + // initialPosition: initialPosition + // } ); + // chargedParticle.returnedToOriginEmitter.addListener( () => this.chargedParticles.remove( chargedParticle ) ); + // return chargedParticle; + // }, + // defaultArguments: [ 1 ] + // } + // }, { + // tandem: tandem.createTandem( 'chargedParticles' ), + // phetioType: GroupIO( ChargedParticleIO ) + // } ); //---------------------------------------------------------------------------------------- // @@ -594,41 +656,12 @@ * - recreate state from a saved PhET-iO state. The tandem is optional but is never * - included if the vector position vector is not included. */ - addElectricPotentialLine( - position = this.electricPotentialSensor.positionProperty.get(), // use the Potential Sensor as default position - tandem = this.electricPotentialLineTandemGroup.createNextTandem() - ) { - assert && assert( position instanceof Vector2, 'position should be Vector2' ); - assert && assert( tandem instanceof Tandem, 'tandem should be a Tandem' ); - - // Do not try to add an equipotential line if there are no charges. - if ( !this.isPlayAreaChargedProperty.get() ) { - return; - } - - // If we are too close to a charged particle, also bail out. - const isTooCloseToParticle = _.some( _.map( this.activeChargedParticles.getArray(), chargedParticle => { - // in model coordinates, should be less than the radius (in the view) of a charged particle - return chargedParticle.positionProperty.get().distance( position ) < 0.03; - } ) ); - if ( isTooCloseToParticle ) { - return; - } - - const electricPotentialLine = new ElectricPotentialLine( - position, - this.enlargedBounds, - this.activeChargedParticles, - this.getElectricPotential.bind( this ), - this.getElectricField.bind( this ), - this.isPlayAreaChargedProperty, - tandem - ); - - this.electricPotentialLines.push( electricPotentialLine ); - - return electricPotentialLine; // for chaining and for PhET-iO restore state - } + // addElectricPotentialLine( + // position = this.electricPotentialSensor.positionProperty.get(), // use the Potential Sensor as default position + // tandem = this.electricPotentialLineTandemGroup.createNextTandem() + // ) { + // + // } /** * Push many electric Potential Lines to an observable array Index: js/charges-and-fields/view/ElectricPotentialSensorNode.js IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- js/charges-and-fields/view/ElectricPotentialSensorNode.js (revision 9491acdf33f51be5f0cdb19015daa215828852e8) +++ js/charges-and-fields/view/ElectricPotentialSensorNode.js (date 1569001000393) @@ -45,28 +45,22 @@ class ElectricPotentialSensorNode extends Node { /** * TODO: this interface is unwieldy and difficult to navigate. Why not pass the model with all these functions? - * @param {ElectricPotentialSensor} electricPotentialSensor - model of the electric potential sensor + * @param {ChargesAndFieldsModel} model * @param {Function} snapToGridLines - A Function that snap the position to the minor gridlines. * @param {Function} getElectricPotentialColor - A function that maps a value of the electric potential to a color - * @param {Function} clearElectricPotentialLines - A function for deleting all electric potential lines in the model - * @param {Function} canAddElectricPotentialLine - - * @param {Function} addElectricPotentialLine - A function for adding an electric potential line to the model * @param {ModelViewTransform2} modelViewTransform - the coordinate transform between model coordinates and view coordinates - * @param {Property.} availableModelBoundsProperty - dragbounds in model coordinates for the electric potential sensor node - * @param {Property.} isPlayAreaChargedProperty - tracks whether net charge in play area is nonzero + * @param {Property.} availableModelBoundsProperty - drag bounds in model coordinates for the electric potential sensor node * @param {Tandem} tandem */ - constructor( electricPotentialSensor, + constructor( model, snapToGridLines, getElectricPotentialColor, - clearElectricPotentialLines, - canAddElectricPotentialLine, - addElectricPotentialLine, modelViewTransform, availableModelBoundsProperty, - isPlayAreaChargedProperty, tandem ) { + const electricPotentialSensor = model.electricPotentialSensor; + super( { cursor: 'pointer', // Show a cursor hand over the sensor tandem: tandem @@ -118,19 +112,19 @@ tandem: tandem.createTandem( 'clearButton' ), baseColor: '#f2f2f2', iconWidth: 23, - listener: () => clearElectricPotentialLines() + listener: () => model.clearElectricPotentialLines() } ); // Create the button that allows to plot the ElectricPotential Lines const plotElectricPotentialLineButton = new PencilButton( tandem.createTandem( 'plotElectricPotentialLineButton' ), { baseColor: '#f2f2f2', - listener: () => addElectricPotentialLine() + listener: () => model.electricPotentialLines.createNextGroupMember( electricPotentialSensor.positionProperty.get() ) } ); const isPlayAreaChargedListener = charged => { plotElectricPotentialLineButton.enabled = charged; }; - isPlayAreaChargedProperty.link( isPlayAreaChargedListener ); + model.isPlayAreaChargedProperty.link( isPlayAreaChargedListener ); // See see https://github.com/phetsims/charges-and-fields/issues/73 const doNotStartDragListener = { @@ -320,7 +314,7 @@ this.disposeElectricPotentialSensorNode = () => { electricPotentialSensor.positionProperty.unlink( positionListener ); electricPotentialSensor.electricPotentialProperty.unlink( potentialListener ); - isPlayAreaChargedProperty.unlink( isPlayAreaChargedListener ); + model.isPlayAreaChargedProperty.unlink( isPlayAreaChargedListener ); }; } Index: js/charges-and-fields/model/ElectricPotentialLine.js IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- js/charges-and-fields/model/ElectricPotentialLine.js (revision 9491acdf33f51be5f0cdb19015daa215828852e8) +++ js/charges-and-fields/model/ElectricPotentialLine.js (date 1569002565334) @@ -150,6 +150,10 @@ */ getEquipotentialPositionArray( position ) { + if ( !this.isPlayAreaChargedProperty.value ) { + return []; + } + /* * General Idea of this algorithm * Index: js/charges-and-fields/model/ElectricPotentialLineIO.js IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- js/charges-and-fields/model/ElectricPotentialLineIO.js (revision 9491acdf33f51be5f0cdb19015daa215828852e8) +++ js/charges-and-fields/model/ElectricPotentialLineIO.js (date 1569002013581) @@ -35,6 +35,15 @@ static fromStateObject( stateObject ) { return {}; } + + /** + * @override + * @param {Object} stateObject + * @returns {Array.<*>} + */ + static stateObjectToArgs( stateObject ) { + return [ Vector2IO.fromStateObject( stateObject.position ) ]; + } } ElectricPotentialLineIO.documentation = 'The vector that shows the charge strength and direction.'; Index: js/charges-and-fields/view/ChargesAndFieldsScreenView.js IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- js/charges-and-fields/view/ChargesAndFieldsScreenView.js (revision 9491acdf33f51be5f0cdb19015daa215828852e8) +++ js/charges-and-fields/view/ChargesAndFieldsScreenView.js (date 1569001000398) @@ -152,16 +152,13 @@ // Create the draggable electric potential sensor node with a electric potential readout const electricPotentialSensorNode = new ElectricPotentialSensorNode( - model.electricPotentialSensor, + model, snapToGridLines, this.getElectricPotentialColor.bind( this ), - model.clearElectricPotentialLines.bind( model ), - model.canAddElectricPotentialLine.bind( model ), - model.addElectricPotentialLine.bind( model ), modelViewTransform, this.availableModelBoundsProperty, - model.isPlayAreaChargedProperty, - tandem.createTandem( 'electricPotentialSensorNode' ) ); + tandem.createTandem( 'electricPotentialSensorNode' ) + ); // Create a visual grid with major and minor lines on the view const gridNode = new GridNode( Index: js/charges-and-fields/view/ElectricPotentialLinesNode.js IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- js/charges-and-fields/view/ElectricPotentialLinesNode.js (revision 9491acdf33f51be5f0cdb19015daa215828852e8) +++ js/charges-and-fields/view/ElectricPotentialLinesNode.js (date 1569002303770) @@ -20,6 +20,7 @@ const Path = require( 'SCENERY/nodes/Path' ); const Rectangle = require( 'SCENERY/nodes/Rectangle' ); const StringUtils = require( 'PHETCOMMON/util/StringUtils' ); + const Tandem = require( 'TANDEM/Tandem' ); const Text = require( 'SCENERY/nodes/Text' ); const Util = require( 'DOT/Util' ); const Vector2Property = require( 'DOT/Vector2Property' ); @@ -41,7 +42,7 @@ */ constructor( electricPotentialLine, modelViewTransform, tandem ) { - super( { cursor: 'pointer', tandem: tandem } ); + super( { cursor: 'pointer' } ); const electricPotential = electricPotentialLine.electricPotential; const position = electricPotentialLine.position; @@ -192,11 +193,14 @@ // Monitor the electricPotentialLineArray and create a path and label for each electricPotentialLine electricPotentialLines.addItemAddedListener( electricPotentialLine => { + if ( electricPotentialLine.chargedParticles.length === 0 ) { + return; + } const electricPotentialLinePath = new ElectricPotentialLinePath( electricPotentialLine.getShape(), modelViewTransform ); pathsNode.addChild( electricPotentialLinePath ); // TODO: Use Group - const voltageLabel = new VoltageLabel( electricPotentialLine, modelViewTransform, tandem.createTandem( 'voltageLabel~' + electricPotentialLine.electricPotentialLineTandem.name ) ); + const voltageLabel = new VoltageLabel( electricPotentialLine, modelViewTransform, Tandem.optional ); labelsNode.addChild( voltageLabel ); if ( IS_DEBUG ) { Index: js/phet-io/charges-and-fields-phet-io-elements-baseline.js IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- js/phet-io/charges-and-fields-phet-io-elements-baseline.js (revision 9491acdf33f51be5f0cdb19015daa215828852e8) +++ js/phet-io/charges-and-fields-phet-io-elements-baseline.js (date 1569001352782) @@ -1,4144 +1,0 @@ -/* eslint-disable */ -window.phet.phetio.phetioElementsBaseline = assert && - { - "chargesAndFields.chargesAndFieldsScreen.activeProperty": { - "phetioDocumentation": "Indicates whether the screen is active. For single-screen simulations, the screen is always active.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ObjectIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.allowNewElectricFieldSensorsProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.allowNewNegativeChargesProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.allowNewPositiveChargesProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.areValuesVisibleProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.chargedParticles": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "GroupIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.chargedParticles.lengthProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.chargedParticles.prototype": { - "phetioDocumentation": "", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "ChargedParticleIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.chargedParticles.prototype.isActiveProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.chargedParticles.prototype.isInteractiveProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.chargedParticles.prototype.isUserControlledProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.chargedParticles.prototype.positionProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.chargesAndSensorsEnclosureBoundsProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.electricFieldSensors": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "GroupIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.electricFieldSensors.lengthProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.electricFieldSensors.prototype": { - "phetioDocumentation": "", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "ModelElementIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.electricFieldSensors.prototype.electricFieldProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.electricFieldSensors.prototype.isActiveProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.electricFieldSensors.prototype.isInteractiveProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.electricFieldSensors.prototype.isUserControlledProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.electricFieldSensors.prototype.positionProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.electricPotentialLines": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "ObservableArrayIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.electricPotentialLines.lengthProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.electricPotentialSensor.electricPotentialProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.electricPotentialSensor.isActiveProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.electricPotentialSensor.positionProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.isElectricFieldDirectionOnlyProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.isElectricFieldVisibleProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.isElectricPotentialVisibleProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.isGridVisibleProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.isPlayAreaChargedProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.measuringTape.basePositionProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.measuringTape.isActiveProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.measuringTape.tipPositionProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.model.snapToGridProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.availableModelBoundsProperty": { - "phetioDocumentation": "Registers the model bounds based on the screen size", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargedParticleNodes": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "GroupIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargedParticleNodes.lengthProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargedParticleNodes.prototype": { - "phetioDocumentation": "", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ModelElementNodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargedParticleNodes.prototype.dragListener.dragAction": { - "phetioDocumentation": "Emits whenever a drag occurs with an EventIO argument. The arguments are:
  1. event: EventIO
", - "phetioDynamicElement": true, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": true, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargedParticleNodes.prototype.dragListener.pressAction": { - "phetioDocumentation": "Executes whenever a press occurs. The first argument when executing can be used to convey info about the Event. The arguments are:
  1. event: EventIO
", - "phetioDynamicElement": true, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargedParticleNodes.prototype.dragListener.releaseAction": { - "phetioDocumentation": "Executes whenever a release occurs. The arguments are:
  1. event: NullableIO
", - "phetioDynamicElement": true, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargedParticleNodes.prototype.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargedParticleNodes.prototype.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargedParticleNodes.prototype.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargesAndSensorsPanel": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargesAndSensorsPanel.electricFieldSensor": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargesAndSensorsPanel.electricFieldSensor.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargesAndSensorsPanel.electricFieldSensor.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargesAndSensorsPanel.electricFieldSensor.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargesAndSensorsPanel.negativeCharge": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargesAndSensorsPanel.negativeCharge.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargesAndSensorsPanel.negativeCharge.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargesAndSensorsPanel.negativeCharge.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargesAndSensorsPanel.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargesAndSensorsPanel.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargesAndSensorsPanel.positiveCharge": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargesAndSensorsPanel.positiveCharge.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargesAndSensorsPanel.positiveCharge.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargesAndSensorsPanel.positiveCharge.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.chargesAndSensorsPanel.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.directionOnlyCheckbox": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.directionOnlyCheckbox.enabledProperty": { - "phetioDocumentation": "When disabled, the checkbox is grayed out and cannot be pressed.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.directionOnlyCheckbox.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.directionOnlyCheckbox.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.directionOnlyCheckbox.property": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "LinkedElementIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.directionOnlyCheckbox.toggleAction": { - "phetioDocumentation": "Emits when user input causes the checkbox to toggle, emitting a single arg: the new boolean value of the checkbox state. The arguments are:
  1. isChecked: BooleanIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.directionOnlyCheckbox.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.electricFieldCheckbox": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.electricFieldCheckbox.enabledProperty": { - "phetioDocumentation": "When disabled, the checkbox is grayed out and cannot be pressed.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.electricFieldCheckbox.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.electricFieldCheckbox.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.electricFieldCheckbox.property": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "LinkedElementIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.electricFieldCheckbox.toggleAction": { - "phetioDocumentation": "Emits when user input causes the checkbox to toggle, emitting a single arg: the new boolean value of the checkbox state. The arguments are:
  1. isChecked: BooleanIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.electricFieldCheckbox.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.gridCheckbox": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.gridCheckbox.enabledProperty": { - "phetioDocumentation": "When disabled, the checkbox is grayed out and cannot be pressed.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.gridCheckbox.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.gridCheckbox.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.gridCheckbox.property": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "LinkedElementIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.gridCheckbox.toggleAction": { - "phetioDocumentation": "Emits when user input causes the checkbox to toggle, emitting a single arg: the new boolean value of the checkbox state. The arguments are:
  1. isChecked: BooleanIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.gridCheckbox.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.snapToGridCheckbox": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.snapToGridCheckbox.enabledProperty": { - "phetioDocumentation": "When disabled, the checkbox is grayed out and cannot be pressed.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.snapToGridCheckbox.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.snapToGridCheckbox.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.snapToGridCheckbox.property": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "LinkedElementIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.snapToGridCheckbox.toggleAction": { - "phetioDocumentation": "Emits when user input causes the checkbox to toggle, emitting a single arg: the new boolean value of the checkbox state. The arguments are:
  1. isChecked: BooleanIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.snapToGridCheckbox.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.valuesCheckbox": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.valuesCheckbox.enabledProperty": { - "phetioDocumentation": "When disabled, the checkbox is grayed out and cannot be pressed.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.valuesCheckbox.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.valuesCheckbox.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.valuesCheckbox.property": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "LinkedElementIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.valuesCheckbox.toggleAction": { - "phetioDocumentation": "Emits when user input causes the checkbox to toggle, emitting a single arg: the new boolean value of the checkbox state. The arguments are:
  1. isChecked: BooleanIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.valuesCheckbox.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.voltageCheckbox": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.voltageCheckbox.enabledProperty": { - "phetioDocumentation": "When disabled, the checkbox is grayed out and cannot be pressed.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.voltageCheckbox.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.voltageCheckbox.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.voltageCheckbox.property": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "LinkedElementIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.voltageCheckbox.toggleAction": { - "phetioDocumentation": "Emits when user input causes the checkbox to toggle, emitting a single arg: the new boolean value of the checkbox state. The arguments are:
  1. isChecked: BooleanIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.controlPanel.voltageCheckbox.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "GroupIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.lengthProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype": { - "phetioDocumentation": "", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ModelElementNodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.arrowNode": { - "phetioDocumentation": "", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.arrowNode.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.arrowNode.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.arrowNode.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.directionLabel": { - "phetioDocumentation": "", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "TextIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.directionLabel.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.directionLabel.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.directionLabel.textProperty": { - "phetioDocumentation": "Property for the displayed text", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.directionLabel.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.dragListener.dragAction": { - "phetioDocumentation": "Emits whenever a drag occurs with an EventIO argument. The arguments are:
  1. event: EventIO
", - "phetioDynamicElement": true, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": true, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.dragListener.pressAction": { - "phetioDocumentation": "Executes whenever a press occurs. The first argument when executing can be used to convey info about the Event. The arguments are:
  1. event: EventIO
", - "phetioDynamicElement": true, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.dragListener.releaseAction": { - "phetioDocumentation": "Executes whenever a release occurs. The arguments are:
  1. event: NullableIO
", - "phetioDynamicElement": true, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.fieldStrengthLabel": { - "phetioDocumentation": "", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "TextIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.fieldStrengthLabel.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.fieldStrengthLabel.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.fieldStrengthLabel.textProperty": { - "phetioDocumentation": "Property for the displayed text", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.fieldStrengthLabel.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricFieldSensorNodes.prototype.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": true, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialLinesNode": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialLinesNode.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialLinesNode.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialLinesNode.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.backgroundRectangle": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.backgroundRectangle.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.backgroundRectangle.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.backgroundRectangle.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.circle": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.circle.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.circle.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.circle.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.clearButton": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.clearButton.enabledProperty": { - "phetioDocumentation": "When disabled, the button is grayed out and cannot be pressed", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.clearButton.firedEmitter": { - "phetioDocumentation": "Emits when the button is fired No arguments.", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "EmitterIO<>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.clearButton.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.clearButton.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.clearButton.pressListener.pressAction": { - "phetioDocumentation": "Executes whenever a press occurs. The first argument when executing can be used to convey info about the Event. The arguments are:
  1. event: EventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.clearButton.pressListener.releaseAction": { - "phetioDocumentation": "Executes whenever a release occurs. The arguments are:
  1. event: NullableIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.clearButton.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.crosshair": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.crosshair.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.crosshair.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.crosshair.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.crosshairMount": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.crosshairMount.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.crosshairMount.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.crosshairMount.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.dragListener.dragAction": { - "phetioDocumentation": "Emits whenever a drag occurs with an EventIO argument. The arguments are:
  1. event: EventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": true, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.dragListener.pressAction": { - "phetioDocumentation": "Executes whenever a press occurs. The first argument when executing can be used to convey info about the Event. The arguments are:
  1. event: EventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.dragListener.releaseAction": { - "phetioDocumentation": "Executes whenever a release occurs. The arguments are:
  1. event: NullableIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.electricPotentialPanelTitleText": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "TextIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.electricPotentialPanelTitleText.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.electricPotentialPanelTitleText.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.electricPotentialPanelTitleText.textProperty": { - "phetioDocumentation": "Property for the displayed text", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.electricPotentialPanelTitleText.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.outlineImage": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.outlineImage.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.outlineImage.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.outlineImage.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.plotElectricPotentialLineButton": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.plotElectricPotentialLineButton.enabledProperty": { - "phetioDocumentation": "When disabled, the button is grayed out and cannot be pressed", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.plotElectricPotentialLineButton.firedEmitter": { - "phetioDocumentation": "Emits when the button is fired No arguments.", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "EmitterIO<>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.plotElectricPotentialLineButton.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.plotElectricPotentialLineButton.pencilButtonImage": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.plotElectricPotentialLineButton.pencilButtonImage.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.plotElectricPotentialLineButton.pencilButtonImage.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.plotElectricPotentialLineButton.pencilButtonImage.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.plotElectricPotentialLineButton.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.plotElectricPotentialLineButton.pressListener.pressAction": { - "phetioDocumentation": "Executes whenever a press occurs. The first argument when executing can be used to convey info about the Event. The arguments are:
  1. event: EventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.plotElectricPotentialLineButton.pressListener.releaseAction": { - "phetioDocumentation": "Executes whenever a release occurs. The arguments are:
  1. event: NullableIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.plotElectricPotentialLineButton.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.voltageReadout": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "TextIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.voltageReadout.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.voltageReadout.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.voltageReadout.textProperty": { - "phetioDocumentation": "Property for the displayed text", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.electricPotentialSensorNode.voltageReadout.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.gridNode.arrowPath": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.gridNode.arrowPath.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.gridNode.arrowPath.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.gridNode.arrowPath.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.gridNode.legendText": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "TextIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.gridNode.legendText.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.gridNode.legendText.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.gridNode.legendText.textProperty": { - "phetioDocumentation": "Property for the displayed text", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.gridNode.legendText.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.gridNode.majorGridLinesPath": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.gridNode.majorGridLinesPath.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.gridNode.majorGridLinesPath.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.gridNode.majorGridLinesPath.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.gridNode.minorGridLinesPath": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.gridNode.minorGridLinesPath.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.gridNode.minorGridLinesPath.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.gridNode.minorGridLinesPath.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.measuringTapeNode": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.measuringTapeNode.baseDragHandler": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ObjectIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.measuringTapeNode.baseDragHandler.dragAction": { - "phetioDocumentation": "A function that executes. The arguments are:
  1. point: Vector2IO. the position of the drag in view coordinates
", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": true, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.measuringTapeNode.baseDragHandler.dragEndAction": { - "phetioDocumentation": "A function that executes. The arguments are:
  1. point: Vector2IO. the position of the drag end in view coordinates
", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.measuringTapeNode.baseDragHandler.dragStartAction": { - "phetioDocumentation": "A function that executes. The arguments are:
  1. point: Vector2IO. the position of the drag start in view coordinates
", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.measuringTapeNode.baseDragHandler.isDraggingProperty": { - "phetioDocumentation": "Indicates whether the object is dragging", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.measuringTapeNode.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.measuringTapeNode.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.measuringTapeNode.tipDragHandler": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ObjectIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.measuringTapeNode.tipDragHandler.dragAction": { - "phetioDocumentation": "A function that executes. The arguments are:
  1. point: Vector2IO. the position of the drag in view coordinates
", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": true, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.measuringTapeNode.tipDragHandler.dragEndAction": { - "phetioDocumentation": "A function that executes. The arguments are:
  1. point: Vector2IO. the position of the drag end in view coordinates
", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.measuringTapeNode.tipDragHandler.dragStartAction": { - "phetioDocumentation": "A function that executes. The arguments are:
  1. point: Vector2IO. the position of the drag start in view coordinates
", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.measuringTapeNode.tipDragHandler.isDraggingProperty": { - "phetioDocumentation": "Indicates whether the object is dragging", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.measuringTapeNode.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.resetAllButton": { - "phetioDocumentation": "The orange, round button that can be used to restore the initial state", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ResetAllButtonIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.resetAllButton.enabledProperty": { - "phetioDocumentation": "When disabled, the button is grayed out and cannot be pressed", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.resetAllButton.firedEmitter": { - "phetioDocumentation": "Emits when the button is fired No arguments.", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "EmitterIO<>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.resetAllButton.isFiringProperty": { - "phetioDocumentation": "Temporarily becomes true while the Reset All button is firing. Commonly used to disable audio effects during reset.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "DerivedPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.resetAllButton.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.resetAllButton.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.resetAllButton.pressListener.pressAction": { - "phetioDocumentation": "Executes whenever a press occurs. The first argument when executing can be used to convey info about the Event. The arguments are:
  1. event: EventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.resetAllButton.pressListener.releaseAction": { - "phetioDocumentation": "Executes whenever a release occurs. The arguments are:
  1. event: NullableIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.resetAllButton.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.backgroundRectangle": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.backgroundRectangle.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.backgroundRectangle.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.backgroundRectangle.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.crosshairMount": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.crosshairMount.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.crosshairMount.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.crosshairMount.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.electricPotentialSensor": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.electricPotentialSensor.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.electricPotentialSensor.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.electricPotentialSensor.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.measuringTape": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.measuringTape.baseDragHandler": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ObjectIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.measuringTape.baseDragHandler.dragAction": { - "phetioDocumentation": "A function that executes. The arguments are:
  1. point: Vector2IO. the position of the drag in view coordinates
", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": true, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.measuringTape.baseDragHandler.dragEndAction": { - "phetioDocumentation": "A function that executes. The arguments are:
  1. point: Vector2IO. the position of the drag end in view coordinates
", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.measuringTape.baseDragHandler.dragStartAction": { - "phetioDocumentation": "A function that executes. The arguments are:
  1. point: Vector2IO. the position of the drag start in view coordinates
", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.measuringTape.baseDragHandler.isDraggingProperty": { - "phetioDocumentation": "Indicates whether the object is dragging", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.measuringTape.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.measuringTape.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.measuringTape.tipDragHandler": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ObjectIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.measuringTape.tipDragHandler.dragAction": { - "phetioDocumentation": "A function that executes. The arguments are:
  1. point: Vector2IO. the position of the drag in view coordinates
", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": true, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.measuringTape.tipDragHandler.dragEndAction": { - "phetioDocumentation": "A function that executes. The arguments are:
  1. point: Vector2IO. the position of the drag end in view coordinates
", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.measuringTape.tipDragHandler.dragStartAction": { - "phetioDocumentation": "A function that executes. The arguments are:
  1. point: Vector2IO. the position of the drag start in view coordinates
", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.measuringTape.tipDragHandler.isDraggingProperty": { - "phetioDocumentation": "Indicates whether the object is dragging", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.measuringTape.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.measuringTapeIconImage": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.measuringTapeIconImage.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.measuringTapeIconImage.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.measuringTapeIconImage.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.outlineImage": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.outlineImage.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.outlineImage.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.outlineImage.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.tipPositionProperty": { - "phetioDocumentation": "Tip position of measuring tape", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.voltageReading": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "TextIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.voltageReading.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.voltageReading.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.voltageReading.textProperty": { - "phetioDocumentation": "Property for the displayed text", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.toolboxPanel.voltageReading.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.chargesAndFieldsScreen.view.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.general.activeProperty": { - "phetioDocumentation": "Determines whether the entire simulation is running and processing user input. Setting this property to false pauses the simulation, and prevents user interaction.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.general.barrierRectangle": { - "phetioDocumentation": "Semi-transparent barrier used to block input events when a dialog is shown, also fades out the background", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.general.barrierRectangle.inputListener.firedEmitter": { - "phetioDocumentation": "A function that executes. No arguments.", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "EmitterIO<>" - }, - "chargesAndFields.general.barrierRectangle.inputListener.pressAction": { - "phetioDocumentation": "Executes whenever a press occurs. The first argument when executing can be used to convey info about the Event. The arguments are:
  1. event: EventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.barrierRectangle.inputListener.releaseAction": { - "phetioDocumentation": "Executes whenever a release occurs. The arguments are:
  1. event: NullableIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO>" - }, - "chargesAndFields.general.barrierRectangle.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.general.barrierRectangle.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.general.barrierRectangle.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.general.browserTabVisibleProperty": { - "phetioDocumentation": "Indicates whether the browser tab containing the simulation is currently visible", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.general.controller.input.mouseDownAction": { - "phetioDocumentation": "Emits when a mouse button is pressed The arguments are:
  1. point: Vector2IO

  2. event: DOMEventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": true, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.controller.input.mouseMovedAction": { - "phetioDocumentation": "Emits when the mouse is moved The arguments are:
  1. point: Vector2IO

  2. event: DOMEventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": true, - "phetioPlayback": true, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.controller.input.mouseOutAction": { - "phetioDocumentation": "Emits when the mouse moves out of the display The arguments are:
  1. point: Vector2IO

  2. event: DOMEventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": true, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.controller.input.mouseOverAction": { - "phetioDocumentation": "Emits when the mouse is moved over a Node The arguments are:
  1. point: Vector2IO

  2. event: DOMEventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": true, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.controller.input.mouseUpAction": { - "phetioDocumentation": "Emits when a mouse button is released The arguments are:
  1. point: Vector2IO

  2. event: DOMEventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": true, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.controller.input.penCancelAction": { - "phetioDocumentation": "Emits when a pen is canceled The arguments are:
  1. id: NumberIO

  2. point: Vector2IO

  3. event: DOMEventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": true, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.controller.input.penEndAction": { - "phetioDocumentation": "Emits when a pen is lifted The arguments are:
  1. id: NumberIO

  2. point: Vector2IO

  3. event: DOMEventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": true, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.controller.input.penMoveAction": { - "phetioDocumentation": "Emits when a pen is moved The arguments are:
  1. id: NumberIO

  2. point: Vector2IO

  3. event: DOMEventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": true, - "phetioPlayback": true, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.controller.input.penStartAction": { - "phetioDocumentation": "Emits when a pen touches the screen The arguments are:
  1. id: NumberIO

  2. point: Vector2IO

  3. event: DOMEventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": true, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.controller.input.touchCancelAction": { - "phetioDocumentation": "Emits when a touch is canceled The arguments are:
  1. id: NumberIO

  2. point: Vector2IO

  3. event: DOMEventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": true, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.controller.input.touchEndAction": { - "phetioDocumentation": "Emits when a touch ends The arguments are:
  1. id: NumberIO

  2. point: Vector2IO

  3. event: DOMEventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": true, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.controller.input.touchMoveAction": { - "phetioDocumentation": "Emits when a touch moves The arguments are:
  1. id: NumberIO

  2. point: Vector2IO

  3. event: DOMEventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": true, - "phetioPlayback": true, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.controller.input.touchStartAction": { - "phetioDocumentation": "Emits when a touch begins The arguments are:
  1. id: NumberIO

  2. point: Vector2IO

  3. event: DOMEventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": true, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.controller.input.validatePointersAction": { - "phetioDocumentation": "A function that executes. No arguments.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": true, - "phetioPlayback": true, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO<>" - }, - "chargesAndFields.general.controller.input.wheelScrollAction": { - "phetioDocumentation": "Emits when the mouse wheel scrolls The arguments are:
  1. event: DOMEventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": true, - "phetioPlayback": true, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.focusProperty": { - "phetioDocumentation": "Stores the current focus for the simulation, null if there is not focus. This is not updated based on mouse or touch input, only keyboard and other alternative inputs.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": true, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.general.navigationBar.phetButton": { - "phetioDocumentation": "The button that appears at the right side of the navigation bar, which shows a menu when pressed", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "PhetButtonIO" - }, - "chargesAndFields.general.navigationBar.phetButton.enabledProperty": { - "phetioDocumentation": "When disabled, the button is grayed out and cannot be pressed", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.general.navigationBar.phetButton.firedEmitter": { - "phetioDocumentation": "Emits when the button is fired No arguments.", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "EmitterIO<>" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu": { - "phetioDocumentation": "This menu is displayed when the PhET button is pressed.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "PhetMenuIO" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.aboutMenuItem": { - "phetioDocumentation": "This menu item shows a dialog with information about the simulation.", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.aboutMenuItem.inputListener.firedEmitter": { - "phetioDocumentation": "A function that executes. No arguments.", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "EmitterIO<>" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.aboutMenuItem.inputListener.pressAction": { - "phetioDocumentation": "Executes whenever a press occurs. The first argument when executing can be used to convey info about the Event. The arguments are:
  1. event: EventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.aboutMenuItem.inputListener.releaseAction": { - "phetioDocumentation": "Executes whenever a release occurs. The arguments are:
  1. event: NullableIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO>" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.aboutMenuItem.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.aboutMenuItem.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.aboutMenuItem.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.optionsMenuItem": { - "phetioDocumentation": "This menu item shows an options dialog.", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.optionsMenuItem.inputListener.firedEmitter": { - "phetioDocumentation": "A function that executes. No arguments.", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "EmitterIO<>" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.optionsMenuItem.inputListener.pressAction": { - "phetioDocumentation": "Executes whenever a press occurs. The first argument when executing can be used to convey info about the Event. The arguments are:
  1. event: EventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.optionsMenuItem.inputListener.releaseAction": { - "phetioDocumentation": "Executes whenever a release occurs. The arguments are:
  1. event: NullableIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO>" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.optionsMenuItem.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.optionsMenuItem.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.optionsMenuItem.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.screenshotMenuItem": { - "phetioDocumentation": "This menu item captures a screenshot from the simulation and saves it to the file system.", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NodeIO" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.screenshotMenuItem.inputListener.firedEmitter": { - "phetioDocumentation": "A function that executes. No arguments.", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "EmitterIO<>" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.screenshotMenuItem.inputListener.pressAction": { - "phetioDocumentation": "Executes whenever a press occurs. The first argument when executing can be used to convey info about the Event. The arguments are:
  1. event: EventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.screenshotMenuItem.inputListener.releaseAction": { - "phetioDocumentation": "Executes whenever a release occurs. The arguments are:
  1. event: NullableIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO>" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.screenshotMenuItem.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.screenshotMenuItem.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.general.navigationBar.phetButton.phetMenu.screenshotMenuItem.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.general.navigationBar.phetButton.pickableProperty": { - "phetioDocumentation": "Set whether the phetButton will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.general.navigationBar.phetButton.pressListener.pressAction": { - "phetioDocumentation": "Executes whenever a press occurs. The first argument when executing can be used to convey info about the Event. The arguments are:
  1. event: EventIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.navigationBar.phetButton.pressListener.releaseAction": { - "phetioDocumentation": "Executes whenever a release occurs. The arguments are:
  1. event: NullableIO
", - "phetioDynamicElement": false, - "phetioEventType": "USER", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO>" - }, - "chargesAndFields.general.navigationBar.titleTextNode": { - "phetioDocumentation": "Displays the title of the simulation in the navigation bar (bottom left)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "TextIO" - }, - "chargesAndFields.general.navigationBar.titleTextNode.opacityProperty": { - "phetioDocumentation": "Opacity of the parent NodeIO, between 0 (invisible) and 1 (fully visible)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.general.navigationBar.titleTextNode.pickableProperty": { - "phetioDocumentation": "Sets whether the node will be pickable (and hence interactive), see the NodeIO documentation for more details", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO>" - }, - "chargesAndFields.general.navigationBar.titleTextNode.textProperty": { - "phetioDocumentation": "Property for the displayed text", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.general.navigationBar.titleTextNode.visibleProperty": { - "phetioDocumentation": "Controls whether the Node will be visible (and interactive), see the NodeIO documentation for more details.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.general.phetioCommandProcessor": { - "phetioDocumentation": "Processes messages from the wrapper frame and returns the results. This serves as the source of PhET-iO data stream messages when commands are invoked from the wrapper.", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": true, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "PhetioCommandProcessorIO" - }, - "chargesAndFields.general.resizeAction": { - "phetioDocumentation": "Executes when the sim is resized The arguments are:
  1. width: NumberIO

  2. height: NumberIO
", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": true, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.general.screenIndexProperty": { - "phetioDocumentation": "Indicates which screen is selected (0-indexed)", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": true, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "NumberPropertyIO" - }, - "chargesAndFields.general.soundEnabledProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "chargesAndFields.general.stepSimulationAction": { - "phetioDocumentation": "A function that executes. The arguments are:
  1. dt: NumberIO
", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": true, - "phetioPlayback": true, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "ActionIO" - }, - "chargesAndFields.global.colorProfile.profileNameProperty": { - "phetioDocumentation": "", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": true, - "phetioStudioControl": true, - "phetioTypeName": "PropertyIO" - }, - "phetioEngine": { - "phetioDocumentation": "Central point for PhET-iO interoperability", - "phetioDynamicElement": false, - "phetioEventType": "MODEL", - "phetioFeatured": false, - "phetioHighFrequency": false, - "phetioPlayback": false, - "phetioReadOnly": false, - "phetioState": false, - "phetioStudioControl": true, - "phetioTypeName": "PhetioEngineIO" - } - }; \ No newline at end of file ```
zepumph commented 4 years ago
zepumph commented 4 years ago

@samreid, @chrisklus, and I worked heavily on trying to get the electric potential lines instrumneted with group and working with state. We made good progress! Lines are showing up in the downstream sim (although they are not correct) Current things broken with state for electricPotentialLines:

Ideas about a future algorithm to investigate:

zepumph commented 4 years ago

@samreid and @chrisklus and I worked on this more today. We are getting very entrenched in the complexities in supporting the equipotential lines in state. The general approach we are working toward is to have the ElectricPotentialLine.js be a mutable object, so that as more charges are added while setting the PhET-iO state, the potential line can gracefully adapt and redraw itself. The issues we are encountering are bountiful, but the most obvious seems to be that marking Properties as "deferred" while setting state, therefore deferring listeners that change important state until later, is causing confusion for electric potential lines.

Here is a patch that has a fair amount of TODOs marked in it, explaining the hacks and shortcommings of the current approach.

```diff Index: js/charges-and-fields/model/ElectricPotentialLine.js IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- js/charges-and-fields/model/ElectricPotentialLine.js (revision d5fbbcf10b79547f61fd7727bb082287962c11b8) +++ js/charges-and-fields/model/ElectricPotentialLine.js (date 1569448936463) @@ -42,6 +42,7 @@ getElectricPotential, getElectricField, isPlayAreaChargedProperty, + changedEmitter, tandem ) { super( { @@ -56,25 +57,32 @@ this.bounds = bounds; // @private this.isPlayAreaChargedProperty = isPlayAreaChargedProperty; // @private + console.log( chargedParticles.length ); this.position = position; // {Vector2} @public read-only static this.electricPotential = getElectricPotential( position ); // {number} @public read-only static - value in volts this.isLineClosed = false; // @private - value will be updated by this.getEquipotentialPositionArray this.isEquipotentialLineTerminatingInsideBounds = true; // @private - value will be updated by this.getEquipotentialPositionArray - this.positionArray = this.getEquipotentialPositionArray( position ); // @public read-only + // TODO: the conditional here is to support mutating this potential line, let's do this better. + this.positionArray = this.getElectricField( position ).magnitude !== 0 ? this.getEquipotentialPositionArray( position ) : []; // @public read-only + console.log( 'position', position ); this.chargeChangedEmitter = new Emitter(); // Used to make sure that electric potential lines will be correct by the time that PhET-iO state has applied the entire state this.chargeChangedListener = () => { this.electricPotential = getElectricPotential( position ); // {number} @public read-only static - value in volts this.positionArray = this.getEquipotentialPositionArray( position ); // @public read-only + this.chargeChangedEmitter.emit(); }; - this.chargedParticles.addItemAddedListener( this.chargeChangedListener ); - this.chargedParticles.addItemRemovedListener( this.chargeChangedListener ); + this.changedEmitter = changedEmitter; + changedEmitter.addListener( this.chargeChangedListener ); + // TODO: these aren't calling charge changed on this state set!?!?! + // this.chargedParticles.addItemAddedListener( this.chargeChangedListener ); + // this.chargedParticles.addItemRemovedListener( this.chargeChangedListener ); // @public this.disposeEmitter = new Emitter(); @@ -84,8 +92,9 @@ * @override */ dispose() { - this.chargedParticles.removeItemAddedListener( this.chargeChangedListener ); - this.chargedParticles.removeItemRemovedListener( this.chargeChangedListener ); + this.changedEmitter.removeListener( this.chargeChangedListener ); + // this.chargedParticles.removeItemAddedListener( this.chargeChangedListener ); + // this.chargedParticles.removeItemRemovedListener( this.chargeChangedListener ); this.chargeChangedEmitter.dispose(); this.disposeEmitter.emit(); this.disposeEmitter.dispose(); Index: js/charges-and-fields/model/ChargesAndFieldsModel.js IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- js/charges-and-fields/model/ChargesAndFieldsModel.js (revision d5fbbcf10b79547f61fd7727bb082287962c11b8) +++ js/charges-and-fields/model/ChargesAndFieldsModel.js (date 1569448936454) @@ -20,6 +20,7 @@ const ElectricPotentialLine = require( 'CHARGES_AND_FIELDS/charges-and-fields/model/ElectricPotentialLine' ); const ElectricPotentialLineIO = require( 'CHARGES_AND_FIELDS/charges-and-fields/model/ElectricPotentialLineIO' ); const ElectricPotentialSensor = require( 'CHARGES_AND_FIELDS/charges-and-fields/model/ElectricPotentialSensor' ); + const Emitter = require( 'AXON/Emitter' ); const Group = require( 'TANDEM/Group' ); const GroupIO = require( 'TANDEM/GroupIO' ); const MeasuringTape = require( 'CHARGES_AND_FIELDS/charges-and-fields/model/MeasuringTape' ); @@ -177,6 +178,11 @@ this.measuringTape = new MeasuringTape( tandem.createTandem( 'measuringTape' ) ); + // TODO: not sure we are keeping this. This was to bypass that add/remove listeners on the chargesParticles list in + // TODO: electricPotentialLine.js was not firing the changed emitter. We need to make sure all changes cause the + // TODO: line to mutate. + this.changedEmitter = new Emitter(); + // Contains the model of electricPotential line, each element is an electricPotential line // @public read-only this.electricPotentialLines = new Group( 'electricPotentialLine', { @@ -186,6 +192,7 @@ assert && assert( position instanceof Vector2, 'position should be Vector2' ); assert && assert( tandem instanceof Tandem, 'tandem should be a Tandem' ); + // for chaining and for PhET-iO restore state return new ElectricPotentialLine( position, @@ -194,6 +201,7 @@ this.getElectricPotential.bind( this ), this.getElectricField.bind( this ), this.isPlayAreaChargedProperty, + this.changedEmitter, tandem ); }, @@ -259,6 +267,7 @@ // update the two grid sensors (if they are set to visible), the electric fields sensors and the electricPotential sensor this.updateAllSensors(); + this.changedEmitter.emit(); }; addedChargedParticle.isActiveProperty.lazyLink( isActiveListener ); @@ -278,6 +287,7 @@ this.updateAllSensors(); } // end of if (isActive) statement + this.changedEmitter.emit(); }; addedChargedParticle.positionProperty.link( positionListener ); @@ -314,6 +324,8 @@ // update the property isPlayAreaCharged to see if is there at least one active charge on the board this.updateIsPlayAreaCharged(); + this.changedEmitter.emit(); + } ); //------------------------ @@ -509,7 +521,8 @@ getElectricField( position ) { const electricField = new Vector2( 0, 0 ); - if ( this.chargedParticles.length === 0 ) { + // TODO: this is a good fix, ecause below is based on activeChargedParticles + if ( this.activeChargedParticles.length === 0 ) { return electricField; } @@ -606,7 +619,7 @@ /** * Push an electricPotentialLine to an observable array - * The drawing of the electricPotential line is handled in the view (electricPotentialLineNode) + * The drawing of the electricPotential line is handled in the view (ElectricPotentialLineView) * @public * @param {Vector2} [position] - optional argument: starting point to calculate the electricPotential line */ @@ -655,7 +668,7 @@ * @public */ clearElectricPotentialLines() { - this.electricPotentialLines.clear(); + // this.electricPotentialLines.clear(); // TODO: figure out a way to clear lines without disrupting phet-io state } /** Index: js/charges-and-fields/view/ElectricPotentialLineView.js IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- js/charges-and-fields/view/ElectricPotentialLineView.js (revision d5fbbcf10b79547f61fd7727bb082287962c11b8) +++ js/charges-and-fields/view/ElectricPotentialLineView.js (date 1569448936440) @@ -70,10 +70,10 @@ // no translatable strings, for debug only const text = new Text( 'model=' + electricPotentialLine.positionArray.length + ' view=' + electricPotentialLine.getPrunedPositionArray( electricPotentialLine.positionArray ).length, { - center: modelViewTransform.modelToViewPosition( electricPotentialLine.position ), + center: modelViewTransform.modelToViewPosition( electricPotentialLine.position ), fill: 'green', - font: ChargesAndFieldsConstants.VOLTAGE_LABEL_FONT - } ); + font: ChargesAndFieldsConstants.VOLTAGE_LABEL_FONT + } ); this.circles = new Node( { children: [
samreid commented 4 years ago

Starting with the patch in the preceding comment, I made enough progress that I thought it should be committed. Multiple equipotential lines are transmitting in the state wrapper. They clear when a charge is moved. It works with studio launch. I'm not aware of any bugs in this part. But dragging the voltage labels around is not transmitted.

@zepumph can you please take a look?

zepumph commented 4 years ago

@samreid your commits look great. I would love to discuss some of the TODOs left in the issue. Below is a ~80% complete addition of instrumenting the electric potential line view. I think the problem has something to do with disposal.

```diff Index: js/charges-and-fields/view/ElectricPotentialLinesNode.js IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- js/charges-and-fields/view/ElectricPotentialLinesNode.js (revision 69cd177eb808f6fdc73ee7d65789e62192aff36d) +++ js/charges-and-fields/view/ElectricPotentialLinesNode.js (date 1569523460825) @@ -11,7 +11,11 @@ // modules const chargesAndFields = require( 'CHARGES_AND_FIELDS/chargesAndFields' ); const ElectricPotentialLineView = require( 'CHARGES_AND_FIELDS/charges-and-fields/view/ElectricPotentialLineView' ); + const Group = require( 'TANDEM/Group' ); + const GroupIO = require( 'TANDEM/GroupIO' ); const Node = require( 'SCENERY/nodes/Node' ); + const ObjectIO = require( 'TANDEM/types/ObjectIO' ); + const ReferenceIO = require( 'TANDEM/types/ReferenceIO' ); // if set to true will show the (model and view) positions use in the calculation of the electric potential lines const IS_DEBUG = phet.chipper.queryParameters.dev; @@ -44,9 +48,24 @@ const labelsNode = new Node(); this.addChild( labelsNode ); + const electricPotentialLineViews = new Group( 'electricPotentialLineView', { + prototype: { + create: ( tandem, prototypeName, electricPotentialLine ) => { + return new ElectricPotentialLineView( electricPotentialLine, modelViewTransform, tandem ); + }, + defaultArguments: [ electricPotentialLines.prototypes.prototype ] + } + }, { + tandem: tandem.createTandem( 'electricPotentialLineViews' ), + phetioType: GroupIO( ReferenceIO ), + phetioState: false + } ); + this.electricPotentialLineViews = electricPotentialLineViews; + this.electricPotentialLineViews.addItemRemovedListener( item => item.dispose() ); + // Monitor the electricPotentialLineArray and create a path and label for each electricPotentialLine electricPotentialLines.addItemAddedListener( function updateView( electricPotentialLine ) { - const electricPotentialLineView = new ElectricPotentialLineView( electricPotentialLine, modelViewTransform ); + const electricPotentialLineView = electricPotentialLineViews.createNextGroupMember( electricPotentialLine ); pathsNode.addChild( electricPotentialLineView.path ); labelsNode.addChild( electricPotentialLineView.voltageLabel ); @@ -56,7 +75,7 @@ circlesNode.addChild( electricPotentialLineView.circles ); } - const modelDisposeListener = () => electricPotentialLineView.dispose(); + const modelDisposeListener = () => electricPotentialLineViews.remove( electricPotentialLineView ); electricPotentialLine.disposeEmitter.addListener( modelDisposeListener ); // try again next time we changed Index: js/charges-and-fields/view/ElectricPotentialLineView.js IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- js/charges-and-fields/view/ElectricPotentialLineView.js (revision 69cd177eb808f6fdc73ee7d65789e62192aff36d) +++ js/charges-and-fields/view/ElectricPotentialLineView.js (date 1569523460824) @@ -22,9 +22,10 @@ const DragListener = require( 'SCENERY/listeners/DragListener' ); const Node = require( 'SCENERY/nodes/Node' ); const Path = require( 'SCENERY/nodes/Path' ); + const PhetioObject = require( 'TANDEM/PhetioObject' ); const Rectangle = require( 'SCENERY/nodes/Rectangle' ); + const ReferenceIO = require( 'TANDEM/types/ReferenceIO' ); const StringUtils = require( 'PHETCOMMON/util/StringUtils' ); - const Tandem = require( 'TANDEM/Tandem' ); const Text = require( 'SCENERY/nodes/Text' ); const Util = require( 'DOT/Util' ); const Vector2Property = require( 'DOT/Vector2Property' ); @@ -37,13 +38,19 @@ // if set to true will show the (model and view) positions use in the calculation of the electric potential lines const IS_DEBUG = phet.chipper.queryParameters.dev; - class ElectricPotentialLineView { + class ElectricPotentialLineView extends PhetioObject { /** * @param {ElectricPotentialLine} electricPotentialLine * @param {ModelViewTransform2} modelViewTransform + * @param {Tandem} tandem */ - constructor( electricPotentialLine, modelViewTransform ) { + constructor( electricPotentialLine, modelViewTransform, tandem ) { + super( { + tandem: tandem, + phetioDynamicElement: true, + phetioType: ReferenceIO + } ); // @public (read-only) {Node} - the path of the potential line this.path = new Path( modelViewTransform.modelToViewShape( electricPotentialLine.getShape() ), { @@ -51,7 +58,7 @@ } ); // @public (read-only) {Node} - label that says the voltage - this.voltageLabel = new VoltageLabel( electricPotentialLine, modelViewTransform, Tandem.optional ); + this.voltageLabel = new VoltageLabel( electricPotentialLine, modelViewTransform, tandem.createTandem( 'voltageLabel' ) ); // @public (read-only) {Node|null} - if running in development mode, then display each sample point on the potential line this.circles = null; @@ -94,6 +101,7 @@ this.path.dispose(); this.voltageLabel.dispose(); this.circles && this.circles.dispose(); + super.dispose(); } } @@ -147,8 +155,7 @@ // Create a background rectangle for the voltage label const backgroundRectangle = new Rectangle( 0, 0, voltageLabelText.width * 1.2, voltageLabelText.height * 1.2, 3, 3, { center: modelViewTransform.modelToViewPosition( position ), - fill: ChargesAndFieldsColorProfile.voltageLabelBackgroundProperty, - tandem: tandem.createTandem( 'backgroundRectangle' ) + fill: ChargesAndFieldsColorProfile.voltageLabelBackgroundProperty } ); this.addChild( backgroundRectangle ); // must go first
zepumph commented 4 years ago

@samreid, @chrisklus, and I worked on this substantially today. We continued the above patch, and finished getting the view of electric potential lines completed. We also worked out all the phet-io work related TODOs. @samreid it would be great if you could review the above commits, and to recommend any other changes. I created a few other issues that should be investigated as part of this work, as well as https://github.com/phetsims/phet-io/issues/1454 in general. I ended up getting rid of NodeIO subtypes, and using ReferenceIO instead. See https://github.com/phetsims/tandem/issues/106 for more investigation.

zepumph commented 4 years ago

Is there anything left but merging to master and closing?

samreid commented 4 years ago

I skimmed the change sets and things looked good. I tested the state wrapper again and it still looks great. I made two minor changes above. But this branch seems like it is ready for master, so I'll merge it now.

samreid commented 4 years ago

I deleted the branch, the last thing for this issue is it would be nice for @zepumph to double check the minor changes above:

zepumph commented 4 years ago

RE: createCorrespondingGroupMember, does this mean that we will need another method for handling this function for heterogenous groups?

zepumph commented 4 years ago

All else looks good.

samreid commented 4 years ago

RE: createCorrespondingGroupMember, does this mean that we will need another method for handling this function for heterogenous groups?

Yes, it would probably be createCorrespondingHeterogeneousGroupMember. I'll open an issue for that. Closing here.

chrisklus commented 4 years ago

In the above commit I renamed the electricFieldSensorGroup member tandem name from "electricFieldSensorGroup" to "electricFieldSensor". Keeping closed.