controlP5.slider 绑定到 controlP5.knob 只想在一个方向上工作

controlP5.slider tied to controlP5.knob only wants to work right one direction

提问人:Jeuke 提问时间:11/15/2023 更新时间:11/16/2023 访问量:35

问:

我有以下使用 controlP5 模块的处理代码:

import controlP5.*;
ControlP5 cp5;

void setup() {
  size(180,240);
  smooth();
  noStroke();
  
  cp5 = new ControlP5(this);
  
   cp5.addSlider("CCV_Control")
               .setPosition(40,40)
               .setNumberOfTickMarks(11)
               .setSliderMode(Slider.FLEXIBLE)
               .showTickMarks(false)
               .snapToTickMarks(true)
               .setSize(100,20)
               .setRange(0,100)
               .setValue(20)
               .setLabel("CCV Percent Open");
  cp5.getController("CCV_Control").getCaptionLabel().align(ControlP5.CENTER, ControlP5.BOTTOM_OUTSIDE).setPaddingY(2);
   cp5.addKnob("Water_Flow")
               .setRange(0,70)
               .setValue(20)
               .setPosition(40,100)
               .setRadius(50)
               .setNumberOfTickMarks(28)
               .snapToTickMarks(true)
               .setLabel("Facility Water");
}

void draw() {
  fill(140);
  rect(20,20,140,200);
}

void Water_Flow(int theValue) {
  float ccvPercentage = 0;
  if (theValue <= 2) {
    cp5.getController("Water_Flow").setColorBackground(color(200, 0, 0));
    cp5.getController("CCV_Control").setValue(0);
  } else {
    cp5.getController("Water_Flow").setColorBackground(color(0, 31, 63)); 
    ccvPercentage = (theValue*110)/70;
    cp5.getController("CCV_Control").setValue(ccvPercentage);
  }
}

void CCV_Control(int theValue) {
  float facilityWaterFlow = 0;
  if (theValue <= 2) {
     //cp5.getController("Water_Flow").setValue(0);
 } else {
    facilityWaterFlow = (theValue*70)/100;
    //cp5.getController("Water_Flow").setValue(facilityWaterFlow);
  }
  println("Water Flow: "+facilityWaterFlow+ " is CCV percent: "+theValue);
}

它工作正常,但我需要这两个控件在两个方向上相互关联。但是当我取消注释“getController(”Water_Flow“)行时,日志中充斥着错误。有没有更简单的方法可以将它们联系在一起?

处理 控制-P5

评论

0赞 apodidae 11/15/2023
这里有一个可能的解释:forum.processing.org/one/topic/......请参阅Andreas.S.的回应。
0赞 Jeuke 11/15/2023
这正是我所想的,但不知道如何处理它。关闭广播是我需要的修复!谢谢!
0赞 Jeuke 11/16/2023
所以我刚刚实现了 .setBroadcast(false) 逻辑,它就像一个魅力。谢谢!

答:

0赞 Jeuke 11/16/2023 #1

以下是基于 apodidae 响应的更新代码:

void Water_Flow(int theValue) {
  float ccvPercentage = 0;
  if (theValue <= 2) {
    cp5.getController("Water_Flow").setColorBackground(color(200, 0, 0));
  } else {
    cp5.getController("Water_Flow").setColorBackground(color(0, 31, 63)); 
    ccvPercentage = (theValue*110)/70;
  }
  // temporarily turn off broadcasting for controller "CCV_Control"
  boolean broadcast = cp5.getController("Water_Flow").isBroadcast();
  cp5.getController("CCV_Control").setBroadcast(false);
  cp5.getController("CCV_Control").setValue(ccvPercentage);
  // change broadcast back to initial value
  cp5.getController("CCV_Control").setBroadcast(broadcast);
}

void CCV_Control(int theValue) {
  float facilityWaterFlow = 0;
  color knobBackground = color(0, 31, 63);
  if (theValue <= 2) {
    knobBackground = color(200, 0, 0);
 } else {
    facilityWaterFlow = (theValue*70)/100;
  }
  // temporarily turn off broadcasting for controller "Water_Flow"
  boolean broadcast = cp5.getController("Water_Flow").isBroadcast();
  cp5.getController("Water_Flow").setBroadcast(false);
  cp5.getController("Water_Flow").setValue(facilityWaterFlow);
  cp5.getController("Water_Flow").setColorBackground(knobBackground);
  // change broadcast back to initial value
  cp5.getController("Water_Flow").setBroadcast(broadcast);

  println("Water Flow: "+facilityWaterFlow+ " is CCV percent: "+theValue);
}
1赞 apodidae 11/16/2023 #2

语法略有变化,可能会稍微缩短您的代码:

//https://forum.processing.org/one/topic/controlp5-error-java-lang-noclassdeffounderror-could-not-initialize-class-java-util-logging-logrecor.html

import controlP5.*;

ControlP5 cp5;

Knob myKnob;
Slider mySlider;

void setup() {
  size(400, 400);
  cp5 = new ControlP5(this);
  mySlider = cp5.addSlider("slider")
    .setPosition(100, 50)
    .setRange(0, 255)
    .setHeight(24)
    .setWidth(200)
    .setValue(50);
  ;
  myKnob = cp5.addKnob("knob")
    .setRange(0, 255)
    .setValue(50)
    .setPosition(100, 140)
    .setNumberOfTickMarks(28)
    .setRadius(50)
    .setDragDirection(Knob.VERTICAL)
    ;
}

void draw() {
}

void slider(float sliderValue) {
  if (myKnob != null) {
    boolean broadcast = myKnob.isBroadcast();
    myKnob.setBroadcast(false);
    myKnob.setValue(sliderValue);
    myKnob.setBroadcast(broadcast);
  }
  println("sliderValue = ", sliderValue);
}

void knob(float knobValue) {
  if (mySlider != null) {
    boolean broadcast = mySlider.isBroadcast();
    mySlider.setBroadcast(false);
    mySlider.setValue(knobValue);
    mySlider.setBroadcast(broadcast);
  }
  println("knob value = ", knobValue);
}