model newmodel large off;;;;;;;;;;;;;;;;;;;;;;;;horiton;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Create a hexahedron;;;;;;;;;;;;;zone create brick size (5 130 60) ... point 0 (, , -) ... point 1 (, , ) ... point 2 (, , ) ... point 3 (, , ) ... group 'layer0';;;;;;;;;;;;;;;Import fault;;;;;;;;;;;;;;;

时间: 2025-06-27 22:11:05 浏览: 10
### 创建六面体模型并划分区域 在建模软件中创建一个尺寸为 (5, 130, 60) 的六面体砖块,并将其点坐标设置到指定位置,同时生成名为 'layer0' 的组,可以通过以下方法实现: #### 几何定义与参数化建模 为了构建所需的几何形状,可以利用常见的三维建模工具(如 AutoCAD、SolidWorks 或 Rhino)。以下是具体操作说明: 1. **创建六面体** 使用矩形命令绘制底边长度为 130 和宽度为 60 的矩形平面图形。随后通过拉伸功能将该矩形沿高度方向扩展至 5 单位的高度[^1]。 2. **调整点坐标** 如果需要精确控制顶点的位置,则可以在建模环境中手动输入各顶点的 XYZ 坐标值来重新定位这些节点。例如,在某些 CAD 平台下支持直接编辑对象属性窗口中的数值字段完成此任务[^2]。 3. **分组管理** 完成上述步骤之后,应选择整个实体结构右键单击菜单选项或者调用相应 API 接口函数以建立一个新的图层/组件标签命名为 “Layer0”,从而便于后续进一步处理流程中的识别与检索工作[^3]。 ```python import rhinoscriptsyntax as rs # Define the box dimensions and position. box_dimensions = [5, 130, 60] position = [0, 0, 0] # Create a rectangular base at origin with given width & depth. rect_base = rs.AddRectangle(rs.WorldXYPlane(), box_dimensions[1], box_dimensions[2]) # Extrude rectangle to form solid brick of specified height. brick_solid = rs.ExtrudeCurveStraight(rect_base, None, [0, 0, box_dimensions[0]]) # Move object into desired location based on provided coordinates. moved_brick = rs.MoveObject(brick_solid, position) # Add created geometry under specific layer name "layer0". rs.ObjectLayer(moved_brick, "layer0") ``` 以上脚本展示了如何借助 Python 脚本语言配合 Rhinoceros 插件自动化执行前述过程的操作细节[^4]。 ---
阅读全文

相关推荐

下面提供的是我采用FLAC3D的7.0版本建立隧道模型并开挖的程序,现在我想测得隧道开挖前后隧道(tunnel)拱顶(z=24)至地表区域内围岩最大主应力的变化,进而找到开挖前后最大主应力相差百分之10的点距离隧道拱顶(z=24)的距离,如果该点不恰好在节点或单元中心,请用线性差值计算该点的位置,请帮我提供一份可以实现上述目标的适用于FLAC3D的7.0版本的代码 model new model large-strain off zone create radial-cylinder point 0 22 0 22 point 1 24.5 0 22 ... point 2 22 0.5 22 point 3 22 0 24.5 ... dimension 2 2 2 2 size 4 3 10 3 ratio 1 1 1 1 group 'solid' ... fill on group 'tunnel' ;reflect normal 1 0 0中的1表示关于Z轴对称,origin为对称原点 zone reflect normal 1 0 0 origin 22 0 22 zone reflect normal 0 0 1 origin 22 0 22 zone create brick point 0 19.5 0 24.5 point 1 24.5 0 24.5 ... point 2 19.5 0.5 24.5 point 3 19.5 0 99 ... size 10 3 149 group 'solid' zone create brick point 0 19.5 0 0 point 1 24.5 0 0 ... point 2 19.5 0.5 0 point 3 19.5 0 19.5 ... size 10 3 39 group 'solid' zone create brick point 0 0 0 19.5 point 1 19.5 0 19.5 ... point 2 0 0.5 19.5 point 3 0 0 24.5 ... size 39 3 10 group 'solid' zone create brick point 0 0 0 24.5 point 1 19.5 0 24.5 ... point 2 0 0.5 24.5 point 3 0 0 99 ... size 39 3 149 group 'solid' zone create brick point 0 0 0 0 point 1 19.5 0 0 ... point 2 0 0.5 0 point 3 0 0 19.5 ... size 39 3 39 group 'solid' zone gridpoint fix velocity-x 0 range position-z -0.1 0.1 zone gridpoint fix velocity-y 0 range position-z -0.1 0.1 zone gridpoint fix velocity-z 0 range position-z -0.1 0.1 zone gridpoint fix velocity-x 0 range position-x -0.1 0.1 zone gridpoint fix velocity-x 0 range position-x 48.9 49.1 zone gridpoint fix velocity-y 0 range position-y -0.1 0.1 zone gridpoint fix velocity-y 0 range position-y 0.4 0.6 zone cmodel assign mohr-coulomb zone property young 5e10 poisson 0.1 cohesion 2.5e6 friction 65 ... density 2752.3 model gravity 0 0 -9.8 model solve model save '1-0.5initial-rsize4-two.sav' zone gridpoin

EPRobot@EPRobot:~/robot_ws/src/eprobot_start/script/one_car_pkg$ roscd usb_cam EPRobot@EPRobot:/opt/ros/melodic/share/usb_cam$ source /opt/ros/melodic/setup.bash EPRobot@EPRobot:/opt/ros/melodic/share/usb_cam$ cd ~/robot_ws EPRobot@EPRobot:~/robot_ws$ source devel/setup.bash EPRobot@EPRobot:~/robot_ws$ roslaunch eprobot_start one_car_start.launch ... logging to /home/EPRobot/.ros/log/9641654e-6234-11f0-a6b3-e45f0131f240/roslaunch-EPRobot-2443.log Checking log directory for disk usage. This may take a while. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB. started roslaunch server http://EPRobot:45445/ SUMMARY ======== CLEAR PARAMETERS * /ekf_se/ PARAMETERS * /amcl/base_frame_id: base_footprint * /amcl/global_frame_id: map * /amcl/gui_publish_rate: 10.0 * /amcl/initial_pose_a: 0.0 * /amcl/initial_pose_x: 0.0 * /amcl/initial_pose_y: 0.0 * /amcl/kld_err: 0.05 * /amcl/kld_z: 0.99 * /amcl/laser_lambda_short: 0.1 * /amcl/laser_likelihood_max_dist: 5.0 * /amcl/laser_max_beams: 60 * /amcl/laser_max_range: 12.0 * /amcl/laser_model_type: likelihood_field * /amcl/laser_sigma_hit: 0.2 * /amcl/laser_z_hit: 0.7 * /amcl/laser_z_max: 0.1 * /amcl/laser_z_rand: 0.3 * /amcl/laser_z_short: 0.1 * /amcl/max_particles: 2000 * /amcl/min_particles: 600 * /amcl/odom_alpha1: 0.2 * /amcl/odom_alpha2: 0.2 * /amcl/odom_alpha3: 0.2 * /amcl/odom_alpha4: 0.2 * /amcl/odom_alpha5: 0.1 * /amcl/odom_frame_id: odom * /amcl/odom_model_type: diff * /amcl/recovery_alpha_fast: 0.2 * /amcl/recovery_alpha_slow: 0.005 * /amcl/resample_interval: 0.4 * /amcl/transform_tolerance: 0.5 * /amcl/update_min_a: 0.05 * /amcl/update_min_d: 0.05 * /amcl/use_map_topic: True * /base_control/base_kd: 0.0 * /base_control/base_ki: 100.0 * /base_control/base_kp: 1000.0 * /base_control/base_kv: 1.0 * /base_control/is_send_anger: false * /camera_uri: http://192.168.3.... * /ekf_se/base_link_frame: /base_footprint * /ekf_se/debug: False * /ekf_se/debug_out_file: /path/to/debug/fi... * /ekf_se/frequency: 30 * /ekf_se/imu0: /imu_data * /ekf_se/imu0_config: [False, False, Fa... * /ekf_se/imu0_differential: False * /ekf_se/imu0_nodelay: True * /ekf_se/imu0_pose_rejection_threshold: 0.8 * /ekf_se/imu0_queue_size: 8 * /ekf_se/imu0_relative: True * /ekf_se/imu0_remove_gravitational_acceleration: True * /ekf_se/initial_estimate_covariance: ['1e-9', 0, 0, 0,... * /ekf_se/map_frame: /map * /ekf_se/odom0: /odom * /ekf_se/odom0_config: [False, False, Fa... * /ekf_se/odom0_differential: False * /ekf_se/odom0_nodelay: True * /ekf_se/odom0_queue_size: 5 * /ekf_se/odom0_relative: True * /ekf_se/odom_frame: /odom * /ekf_se/print_diagnostics: True * /ekf_se/process_noise_covariance: [0.01, 0, 0, 0, 0... * /ekf_se/publish_acceleration: True * /ekf_se/publish_tf: True * /ekf_se/sensor_timeout: 0.025 * /ekf_se/transform_time_offset: 0.0001 * /ekf_se/transform_timeout: 0.025 * /ekf_se/two_d_mode: True * /ekf_se/world_frame: /odom * /image_view/autosize: True * /laser_filter/scan_filter_chain: [{'type': 'laser_... * /lslidar_driver_node/angle_disable_max: 0 * /lslidar_driver_node/angle_disable_min: 0 * /lslidar_driver_node/compensation: False * /lslidar_driver_node/frame_id: base_laser_link * /lslidar_driver_node/high_reflection: False * /lslidar_driver_node/interface_selection: serial * /lslidar_driver_node/lidar_name: M10 * /lslidar_driver_node/max_range: 100.0 * /lslidar_driver_node/min_range: 0.1 * /lslidar_driver_node/pubPointCloud2: False * /lslidar_driver_node/pubScan: True * /lslidar_driver_node/scan_topic: scan * /lslidar_driver_node/serial_port: /dev/EPRobot_laser * /lslidar_driver_node/use_gps_ts: False * /map_server/frame_id: map * /move_base/TebLocalPlannerROS/acc_lim_theta: 0.3 * /move_base/TebLocalPlannerROS/acc_lim_x: 0.2 * /move_base/TebLocalPlannerROS/allow_init_with_backwards_motion: True * /move_base/TebLocalPlannerROS/cmd_angle_instead_rotvel: False * /move_base/TebLocalPlannerROS/costmap_converter_plugin: * /move_base/TebLocalPlannerROS/costmap_converter_rate: 5 * /move_base/TebLocalPlannerROS/costmap_converter_spin_thread: True * /move_base/TebLocalPlannerROS/costmap_obstacles_behind_robot_dist: 1.0 * /move_base/TebLocalPlannerROS/dt_hysteresis: 0.1 * /move_base/TebLocalPlannerROS/dt_ref: 0.3 * /move_base/TebLocalPlannerROS/dynamic_obstacle_inflation_dist: 0.2 * /move_base/TebLocalPlannerROS/enable_homotopy_class_planning: False * /move_base/TebLocalPlannerROS/enable_multithreading: True * /move_base/TebLocalPlannerROS/exact_arc_length: False * /move_base/TebLocalPlannerROS/feasibility_check_no_poses: 3 * /move_base/TebLocalPlannerROS/footprint_model/line_end: [0.1, 0.0] * /move_base/TebLocalPlannerROS/footprint_model/line_start: [-0.1, 0.0] * /move_base/TebLocalPlannerROS/footprint_model/type: line * /move_base/TebLocalPlannerROS/force_reinit_new_goal_dist: 0.5 * /move_base/TebLocalPlannerROS/free_goal_vel: False * /move_base/TebLocalPlannerROS/global_plan_overwrite_orientation: True * /move_base/TebLocalPlannerROS/global_plan_viapoint_sep: 3.0 * /move_base/TebLocalPlannerROS/h_signature_prescaler: 0.5 * /move_base/TebLocalPlannerROS/h_signature_threshold: 0.1 * /move_base/TebLocalPlannerROS/include_costmap_obstacles: True * /move_base/TebLocalPlannerROS/include_dynamic_obstacles: True * /move_base/TebLocalPlannerROS/inflation_dist: 0.35 * /move_base/TebLocalPlannerROS/is_footprint_dynamic: False * /move_base/TebLocalPlannerROS/legacy_obstacle_association: False * /move_base/TebLocalPlannerROS/max_global_plan_lookahead_dist: 10.0 * /move_base/TebLocalPlannerROS/max_number_classes: 2 * /move_base/TebLocalPlannerROS/max_vel_theta: 1.0 * /move_base/TebLocalPlannerROS/max_vel_x: 0.6 * /move_base/TebLocalPlannerROS/max_vel_x_backwards: 0.3 * /move_base/TebLocalPlannerROS/max_vel_y: 0.0 * /move_base/TebLocalPlannerROS/min_obstacle_dist: 0.55 * /move_base/TebLocalPlannerROS/min_turning_radius: 0.6 * /move_base/TebLocalPlannerROS/no_inner_iterations: 5 * /move_base/TebLocalPlannerROS/no_outer_iterations: 4 * /move_base/TebLocalPlannerROS/obstacle_association_cutoff_factor: 5.0 * /move_base/TebLocalPlannerROS/obstacle_association_force_inclusion_factor: 1.5 * /move_base/TebLocalPlannerROS/obstacle_cost_exponent: 5.5 * /move_base/TebLocalPlannerROS/obstacle_heading_threshold: 0.45 * /move_base/TebLocalPlannerROS/obstacle_keypoint_offset: 0.1 * /move_base/TebLocalPlannerROS/obstacle_poses_affected: 15 * /move_base/TebLocalPlannerROS/odom_topic: odom * /move_base/TebLocalPlannerROS/optimization_activate: True * /move_base/TebLocalPlannerROS/optimization_verbose: False * /move_base/TebLocalPlannerROS/oscillation_recovery: True * /move_base/TebLocalPlannerROS/penalty_epsilon: 0.08 * /move_base/TebLocalPlannerROS/roadmap_graph_area_length_scale: 1.0 * /move_base/TebLocalPlannerROS/roadmap_graph_area_width: 5 * /move_base/TebLocalPlannerROS/roadmap_graph_no_samples: 15 * /move_base/TebLocalPlannerROS/selection_alternative_time_cost: False * /move_base/TebLocalPlannerROS/selection_cost_hysteresis: 1.0 * /move_base/TebLocalPlannerROS/selection_obst_cost_scale: 1.0 * /move_base/TebLocalPlannerROS/selection_viapoint_cost_scale: 1.0 * /move_base/TebLocalPlannerROS/shrink_horizon_backup: True * /move_base/TebLocalPlannerROS/simple_exploration: False * /move_base/TebLocalPlannerROS/teb_autosize: True * /move_base/TebLocalPlannerROS/via_points_ordered: False * /move_base/TebLocalPlannerROS/visualize_hc_graph: False * /move_base/TebLocalPlannerROS/weight_acc_lim_theta: 1 * /move_base/TebLocalPlannerROS/weight_acc_lim_x: 1 * /move_base/TebLocalPlannerROS/weight_adapt_factor: 1.0 * /move_base/TebLocalPlannerROS/weight_dynamic_obstacle: 100 * /move_base/TebLocalPlannerROS/weight_dynamic_obstacle_inflation: 0.6 * /move_base/TebLocalPlannerROS/weight_inflation: 1.0 * /move_base/TebLocalPlannerROS/weight_kinematics_forward_drive: 800 * /move_base/TebLocalPlannerROS/weight_kinematics_nh: 1000 * /move_base/TebLocalPlannerROS/weight_kinematics_turning_radius: 6.0 * /move_base/TebLocalPlannerROS/weight_max_vel_theta: 1 * /move_base/TebLocalPlannerROS/weight_max_vel_x: 2 * /move_base/TebLocalPlannerROS/weight_obstacle: 190 * /move_base/TebLocalPlannerROS/weight_optimaltime: 15 * /move_base/TebLocalPlannerROS/weight_shortest_path: 5.0 * /move_base/TebLocalPlannerROS/weight_viapoint: 10.0 * /move_base/TebLocalPlannerROS/wheelbase: 0.3 * /move_base/TebLocalPlannerROS/xy_goal_tolerance: 0.1 * /move_base/TebLocalPlannerROS/yaw_goal_tolerance: 0.1 * /move_base/base_local_planner: teb_local_planner... * /move_base/clearing_rotation_allowed: False * /move_base/conservative_reset_dist: 0.2 * /move_base/controller_frequency: 5.0 * /move_base/controller_patience: 15.0 * /move_base/global_costmap/footprint: [[-0.18, -0.18], ... * /move_base/global_costmap/global_frame: map * /move_base/global_costmap/inflation_layer/cost_scaling_factor: 10.0 * /move_base/global_costmap/inflation_layer/enabled: True * /move_base/global_costmap/inflation_layer/inflation_radius: 0.3 * /move_base/global_costmap/inflation_radius: 0.4 * /move_base/global_costmap/laser_scan_sensor/clearing: True * /move_base/global_costmap/laser_scan_sensor/data_type: LaserScan * /move_base/global_costmap/laser_scan_sensor/marking: True * /move_base/global_costmap/laser_scan_sensor/topic: scan * /move_base/global_costmap/map_type: costmap * /move_base/global_costmap/observation_sources: laser_scan_sensor * /move_base/global_costmap/obstacle_layer/combination_method: 1 * /move_base/global_costmap/obstacle_layer/enabled: True * /move_base/global_costmap/obstacle_layer/inflation_radius: 0.2 * /move_base/global_costmap/obstacle_layer/obstacle_range: 6.5 * /move_base/global_costmap/obstacle_layer/raytrace_range: 6.0 * /move_base/global_costmap/obstacle_layer/track_unknown_space: False * /move_base/global_costmap/plugins: [{'type': 'costma... * /move_base/global_costmap/publish_frequency: 5.0 * /move_base/global_costmap/robot_base_frame: base_footprint * /move_base/global_costmap/static_layer/enabled: True * /move_base/global_costmap/static_layer/map_topic: /map * /move_base/global_costmap/static_map: True * /move_base/global_costmap/transform_tolerance: 0.5 * /move_base/global_costmap/update_frequency: 5.0 * /move_base/local_costmap/cost_scaling_factor: 10 * /move_base/local_costmap/footprint: [[-0.18, -0.18], ... * /move_base/local_costmap/global_frame: map * /move_base/local_costmap/height: 3 * /move_base/local_costmap/inflation_layer/cost_scaling_factor: 10.0 * /move_base/local_costmap/inflation_layer/enabled: True * /move_base/local_costmap/inflation_layer/inflation_radius: 0.3 * /move_base/local_costmap/inflation_radius: 0.16 * /move_base/local_costmap/laser_scan_sensor/clearing: True * /move_base/local_costmap/laser_scan_sensor/data_type: LaserScan * /move_base/local_costmap/laser_scan_sensor/marking: True * /move_base/local_costmap/laser_scan_sensor/topic: scan * /move_base/local_costmap/map_type: costmap * /move_base/local_costmap/observation_sources: laser_scan_sensor * /move_base/local_costmap/obstacle_layer/combination_method: 1 * /move_base/local_costmap/obstacle_layer/enabled: True * /move_base/local_costmap/obstacle_layer/inflation_radius: 0.2 * /move_base/local_costmap/obstacle_layer/obstacle_range: 6.5 * /move_base/local_costmap/obstacle_layer/raytrace_range: 6.0 * /move_base/local_costmap/obstacle_layer/track_unknown_space: False * /move_base/local_costmap/plugins: [{'type': 'costma... * /move_base/local_costmap/publish_frequency: 5.0 * /move_base/local_costmap/resolution: 0.05 * /move_base/local_costmap/robot_base_frame: base_footprint * /move_base/local_costmap/rolling_window: True * /move_base/local_costmap/static_layer/enabled: True * /move_base/local_costmap/static_layer/map_topic: /map * /move_base/local_costmap/static_map: False * /move_base/local_costmap/transform_tolerance: 0.5 * /move_base/local_costmap/update_frequency: 5.0 * /move_base/local_costmap/width: 3 * /move_base/oscillation_distance: 0.2 * /move_base/oscillation_timeout: 10.0 * /move_base/planner_frequency: 1.0 * /move_base/planner_patience: 5.0 * /robot_description: <?xml version="1.... * /rosdistro: melodic * /rosversion: 1.14.13 * /time0: 5.0 * /time1: 15.0 * /time2: 2.0 * /time3: 10.0 * /time4: 2.0 * /time5: 5.0 * /usb_cam/camera_frame_id: usb_cam * /usb_cam/color_format: yuv422p * /usb_cam/image_height: 960 * /usb_cam/image_width: 1280 * /usb_cam/io_method: mmap * /usb_cam/pixel_format: yuyv * /usb_cam/video_device: /dev/video0 NODES / amcl (amcl/amcl) base_control (eprobot_start/art_racecar.py) base_to_camera (tf/static_transform_publisher) base_to_gyro (tf/static_transform_publisher) base_to_laser (tf/static_transform_publisher) base_to_link (tf/static_transform_publisher) ekf_se (robot_localization/ekf_localization_node) image_view (image_view/image_view) joint_state_publisher (joint_state_publisher/joint_state_publisher) laser_filter (laser_filters/scan_to_scan_filter_chain) lslidar_driver_node (lslidar_driver/lslidar_driver_node) map_server (map_server/map_server) move_base (move_base/move_base) one_car_start (eprobot_start/one_car_start.py) robot_state_publisher (robot_state_publisher/robot_state_publisher) usb_cam (usb_cam/usb_cam_node) auto-starting new master process[master]: started with pid [2469] ROS_MASTER_URI=http://EPRobot:11311 setting /run_id to 9641654e-6234-11f0-a6b3-e45f0131f240 process[rosout-1]: started with pid [2498] started core service [/rosout] process[usb_cam-2]: started with pid [2502] process[image_view-3]: started with pid [2519] [ INFO] [1752663855.296181382]: Initializing nodelet with 4 worker threads. [ INFO] [1752663855.480798436]: using default calibration URL [ INFO] [1752663855.484462140]: camera calibration URL: file:///home/EPRobot/.ros/camera_info/head_camera.yaml [ INFO] [1752663855.491997843]: Starting 'head_camera' (/dev/video0) at 1280x960 via mmap (yuyv) at 30 FPS [ INFO] [1752663855.661129732]: Using transport "raw" Unable to init server: Could not connect: Connection refused (image_raw:2519): Gtk-WARNING **: 19:04:15.720: cannot open display: [ WARN] [1752663855.904948901]: unknown control 'focus_auto' process[base_to_link-4]: started with pid [2537] [image_view-3] process has died [pid 2519, exit code 1, cmd /opt/ros/melodic/lib/image_view/image_view image:=/usb_cam/image_raw __name:=image_view __log:=/home/EPRobot/.ros/log/9641654e-6234-11f0-a6b3-e45f0131f240/image_view-3.log]. log file: /home/EPRobot/.ros/log/9641654e-6234-11f0-a6b3-e45f0131f240/image_view-3*.log process[base_to_gyro-5]: started with pid [2556] process[base_to_laser-6]: started with pid [2562] process[base_to_camera-7]: started with pid [2583] process[joint_state_publisher-8]: started with pid [2604] process[robot_state_publisher-9]: started with pid [2610] /opt/ros/melodic/lib/python2.7/dist-packages/roslib/packages.py:470: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal if resource_name in files: process[base_control-10]: started with pid [2618] process[lslidar_driver_node-11]: started with pid [2647] [ INFO] [1752663866.105583696]: Lidar is M10 [ INFO] [1752663866.111040782]: Opening PCAP file port = /dev/EPRobot_laser, baud_rate = 460800 open_port /dev/EPRobot_laser OK ! [ INFO] [1752663866.125467287]: Initialised lslidar without error process[laser_filter-12]: started with pid [2676] [ INFO] [1752663867.962878802]: clear_inside(!invert): true [INFO] [1752663869.073894]: base control start... process[map_server-13]: started with pid [2683] [INFO] [1752663869.127131]: LaserMode : Express [INFO] [1752663869.131959]: is_pub_odom_tf : false [INFO] [1752663869.138982]: is_send_anger : false [INFO] [1752663869.144625]: Opening Serial [INFO] [1752663869.150115]: Serial Open Succeed process[amcl-14]: started with pid [2718] [ INFO] [1752663871.037123474]: Subscribed to map topic. process[move_base-15]: started with pid [2774] process[ekf_se-16]: started with pid [2814] ERROR: cannot launch node of type [eprobot_start/one_car_start.py]: Cannot locate node of type [one_car_start.py] in package [eprobot_start]. Make sure file exists in package path and permission is set to executable (chmod +x) [ WARN] [1752663879.396290450]: Timed out waiting for transform from base_footprint to map to become available before running costmap, tf error: canTransform: target_frame map does not exist. canTransform: source_frame base_footprint does not exist.. canTransform returned after 0.100705 timeout was 0.1. [ INFO] [1752663880.901153484]: Received a 113 X 155 map @ 0.050 m/pix [ INFO] [1752663880.938459111]: Initializing likelihood field model; this can take some time on large maps... [ INFO] [1752663881.063300341]: Done initializing likelihood field model. [ WARN] [1752663883.460416017]: Transform from IMU_link to base_footprint was unavailable for the time requested. Using latest instead. [ WARN] [1752663884.436037594]: Timed out waiting for transform from base_footprint to map to become available before running costmap, tf error: canTransform: target_frame map does not exist.. canTransform returned after 0.100968 timeout was 0.1. [ WARN] [1752663886.469901598]: No laser scan received (and thus no pose updates have been published) for 1752663886.469788 seconds. Verify that data is being published on the /scan_filtered topic. [ WARN] [1752663887.516970206]: global_costmap: Pre-Hydro parameter "static_map" unused since "plugins" is provided [ WARN] [1752663887.518994345]: global_costmap: Pre-Hydro parameter "map_type" unused since "plugins" is provided [ INFO] [1752663887.523573417]: global_costmap: Using plugin "static_layer" [ INFO] [1752663887.657142563]: Requesting the map... [ INFO] [1752663889.166172394]: Resizing costmap to 113 X 155 at 0.050000 m/pix [ INFO] [1752663889.265445621]: Received a 113 X 155 map at 0.050000 m/pix [ INFO] [1752663889.280243055]: global_costmap: Using plugin "obstacle_layer" [ INFO] [1752663889.298549771]: Subscribed to Topics: [ INFO] [1752663889.349325212]: global_costmap: Using plugin "inflation_layer" [ WARN] [1752663889.545199085]: local_costmap: Pre-Hydro parameter "static_map" unused since "plugins" is provided [ WARN] [1752663889.547135725]: local_costmap: Pre-Hydro parameter "map_type" unused since "plugins" is provided [ INFO] [1752663889.551484224]: local_costmap: Using plugin "static_layer" [ INFO] [1752663889.571839522]: Requesting the map... [ INFO] [1752663889.577998384]: Resizing static layer to 113 X 155 at 0.050000 m/pix [ INFO] [1752663889.677619257]: Received a 113 X 155 map at 0.050000 m/pix [ INFO] [1752663889.693015967]: local_costmap: Using plugin "obstacle_layer" [ INFO] [1752663889.706179575]: Subscribed to Topics: [ INFO] [1752663889.742291675]: local_costmap: Using plugin "inflation_layer" [ INFO] [1752663889.976098453]: Created local_planner teb_local_planner/TebLocalPlannerROS [ INFO] [1752663890.170609667]: Footprint model 'line' (line_start: [-0.1,0]m, line_end: [0.1,0]m) loaded for trajectory optimization. [ INFO] [1752663890.172065624]: Parallel planning in distinctive topologies disabled. [ INFO] [1752663890.172326715]: No costmap conversion plugin specified. All occupied costmap cells are treaten as point obstacles. [ INFO] [1752663891.088227612]: Recovery behavior will clear layer 'obstacles' [ INFO] [1752663891.107617471]: Recovery behavior will clear layer 'obstacles' [ INFO] [1752663891.666258229]: odom received!

import ToolBenefitOperator from '@aiComponents/BenefitOperator'; import AiToolBlockItem from '@aiComponents/BlockItem'; import { AiToolSquareCoverCard } from '@aiComponents/CardItems'; import AiToolConfigProvider from '@aiComponents/ConfigProvider'; import DrawSizeControls from '@aiComponents/DrawSizeControls'; import DrawStepOperateLayoutPC from '@aiComponents/DrawStepOperateLayout/pc'; import AiToolGenerateModal from '@aiComponents/GenerateModal'; import ToolVerticalIntroduceLayoutPC2 from '@aiComponents/IntroduceLayout/pc/vertical2'; import ToolVerticalIntroduceLayoutContent1 from '@aiComponents/IntroduceLayout/pc/vertical2/componetns/content1'; import MaterialIntroduceModal from '@aiComponents/MaterialIntroduceModal'; import { AiToolVipOptionItem } from '@aiComponents/OptionItems'; import ToggleGenerateInfoPanelItem from '@aiComponents/ToggleInfoPanel/PanelItem.tsx'; import { QuestionCircleOutlined } from '@ant-design/icons'; import IconFont from '@components/IconFont'; import ImageSelectorWrapModal from '@components/ImageSelectorWrapModal'; import ProductAuth from '@components/ProductAuth'; import ThemeButton from '@components/ThemeButton'; import ThemeConfigProvider from '@components/ThemeConfigProvider'; import ThemeSegmented from '@components/ThemeSegmented'; import ThemeTextArea from '@components/ThemeTextArea'; import ToolEquityCountWrap from '@components/ToolEquityCountWrap'; import { requestAdvanceDrawSubStyleConfigCategory } from '@services/advanceDraw/config.ts'; import { requestComfyUIDrawGenerate } from '@services/advanceDraw/generate.ts'; import { requestModelRender } from '@services/comfyUI.ts'; import { CoolImage } from '@wander/common-components'; import { Collapse, Image, message, Popover, Typography } from 'antd'; import classNames from 'classnames/bind'; import type { CSSProperties } from 'react'; import { useTranslation } from 'react-i18next'; import type { UploadImageType } from '@/components/UploadImageCard'; import UploadImageCard from '@/components/UploadImageCard'; import { enlargeDownloadOptions } from '@/config/aiTool.ts'; import { jzxzComfyUIDrawSizeTypeList } from '@/config/comfyUI.ts'; import KjlResultQuickAccessBox from '@/pages/AiTools/components/KjlResultQuickAccessBox'; import ToggleGenerateInfoPopover from '@/pages/AiTools/components/ToggleInfoPanel'; import { lockingMaterialList } from '@/pages/AiTools/Draw/configs.ts'; import GenerateCountLimitModal from '@/pages/AiTools/InspirationDraw/Operate/jzxz/components/GenerateCountLimitModal'; import { modelRenderGenerateCountList, modelRenderSpeedupKey, modelRenderToolKey, modelRenderToolName, TRACK_MODEL_RENDER_NAME, } from '@/pages/AiTools/ModelRender/config.ts'; import JzxzResultQuickAccessBox from '@/pages/AiTools/ModelRender/Operate/components/JzxzQuickToolMenu'; import ModelRenderStyleCategoryGrid from '@/pages/AiTools/ModelRender/Operate/components/StyleCategoryGrid'; import useModelRender from '@/pages/AiTools/ModelRender/Operate/hooks.ts'; import { LockingMaterialTypeEnum } from '@/types/draw.ts'; import styles from './index.module.less'; const cx = classNames.bind(styles); const { Paragraph } = Typography; const { Panel } = Collapse; const ModelRenderOperatePC = () => { const { spatialPositionConfig, setSpatialCategoryIndex, imageSelectorWrapModalRef, materialIntroduceModalRef, generateComfyUiModalRef, setSelectPositionIndex, generateParams, resultImageSelectIndex, setLockingMaterialType, introduceLayoutShow, setIntroduceLayoutShow, setDescription, modelScenarioActiveIndex, onBaseImageFinish, setPreciseRender, onComfyUiGenerateSuccess, onBaseImageChange, onStepStart, styleCategoryList, spatialCategoryIndex, baseImageCardRef, productType, styleCategoryGridRef, setStyleCategoryList, toolEquityCountWrapRef, drawStepOperateLayoutRef, generateComfyUiPreciseRenderingModalRef, description, lockingMaterialType, preciseRender, selectPositionIndex, styleImageCardRef, handleScenarioClick, setFilteredStyleCategoryList, jzxzCategoryList, filteredStyleCategoryList, scenarioKey, onGenerateCountsChange, generateCounts, sizeType, setSizeType, limitModalOpen, setLimitModalOpen, generateCountLimitModalRef, baseImageTagList, } = useModelRender(); const { t } = useTranslation(); // 第一步 底图的上传 const firstStepRender = (uploadImage: UploadImageType | null) => { return ( <> <UploadImageCard.Card style={{ minHeight: '100%', height: 'auto', }} ref={baseImageCardRef} onUploadImageChange={onBaseImageChange} enableKjlUpload enableScreenshot={productType === 'JZXZ'} uploadImageIcon={{ customUploadBtn: (className) => { return ( <> { imageSelectorWrapModalRef.current?.setModalStatus('SELECT_MODAL'); }} > {t('HuabanUploadBtn-rWrt')} </> ); }, }} onScreenshotSuccess={(value) => { imageSelectorWrapModalRef.current?.setModalStatus('LEAFER_FRAME'); imageSelectorWrapModalRef.current?.onGenerateFrame({ width: value.width, height: value.height, url: value.largeUrl, }); setTimeout(() => { imageSelectorWrapModalRef.current?.setOperationType('CLIP_FRAME'); }, 600); }} hidden={!!uploadImage} /> <CoolImage placeholder={{ type: 'loadingIcon' }} className={cx('image')} style={{ objectFit: 'contain' }} src={uploadImage?.largeUrl} alt="" /> <IconFont type="micro-icon-edit" className={cx('operator_icon')} onClick={() => { imageSelectorWrapModalRef.current?.setModalStatus('LEAFER_FRAME'); // 画板没有原图信息的时候 先创建画板 const originImageInfo = imageSelectorWrapModalRef.current?.getOriginImgInfo(); if (!originImageInfo?.url && uploadImage) { imageSelectorWrapModalRef.current?.onGenerateFrame({ url: uploadImage?.largeUrl, width: uploadImage.width, height: uploadImage.height, }); } }} /> <IconFont type="micro-icon-trash-can" className={cx('operator_icon')} onClick={() => { baseImageCardRef.current?.setUploadImage(null); imageSelectorWrapModalRef.current?.clearFrame(); }} /> </> ); }; // JKJL 第二步内容 const secondStepRender = ( <> {styleCategoryList.map((value, index) => ( { setSpatialCategoryIndex(index); styleCategoryGridRef.current?.setFirstCategoryIndex(index); styleCategoryGridRef.current?.resetSecondCategoryIndex?.(); if (!value.children && value.justCategory) { try { styleCategoryGridRef.current?.setSecondCategoryRequesting(true); const subCategoryList = await requestAdvanceDrawSubStyleConfigCategory(value.mid); // 替换当前类目下的子类目信息 setStyleCategoryList( styleCategoryList.map((value1, index1) => { if (index1 === index) { return { ...value1, children: subCategoryList, }; } return value1; }), ); styleCategoryGridRef.current?.setSecondCategoryRequesting(false); } catch (e) { styleCategoryGridRef.current?.setSecondCategoryRequesting(false); console.error(e); } } }} > {value.name} ))} {spatialPositionConfig[styleCategoryList[spatialCategoryIndex]?.mid || '']?.map( (value, index) => ( { setSelectPositionIndex(index); }} > <AiToolSquareCoverCard coverUrl={value.coverUrl} extra={{value.name}} /> ), )} </> ); // JZXZ第二步 const jzxzSecondStepRender = () => { const currentList = filteredStyleCategoryList.length > 0 ? filteredStyleCategoryList : styleCategoryList; // 获取当前选中的类目MID const currentCategoryMid = currentList[spatialCategoryIndex]?.mid; return ( <> {currentList.map((value, index) => ( { setSpatialCategoryIndex(index); console.log('index', index); styleCategoryGridRef.current?.setFirstCategoryIndex(index); if (!value.children && value.justCategory) { try { styleCategoryGridRef.current?.setSecondCategoryRequesting(true); const subCategoryList = await requestAdvanceDrawSubStyleConfigCategory( value.mid, ); // 更新原始列表 setStyleCategoryList((prev) => prev.map((item) => item.mid === value.mid ? { ...item, children: subCategoryList } : item, ), ); // 更新过滤列表 setFilteredStyleCategoryList((prev) => prev.map((item) => item.mid === value.mid ? { ...item, children: subCategoryList } : item, ), ); styleCategoryGridRef.current?.setSecondCategoryRequesting(false); } catch (e) { styleCategoryGridRef.current?.setSecondCategoryRequesting(false); console.error(e); } } }} > {value.name} ))} {currentCategoryMid && spatialPositionConfig[currentCategoryMid] && ( {spatialPositionConfig[currentCategoryMid].map((value, index) => ( setSelectPositionIndex(index)} > <AiToolSquareCoverCard coverUrl={value.coverUrl} extra={{value.name}} /> ))} )} </> ); }; // 酷家乐-精确渲染 const secondCategoryPreciseRendering = (url: string) => ( <> {/* 二级类目前新增精确渲染 */} { setPreciseRender(true); }} > <AiToolSquareCoverCard coverUrl={url} extra={ <> 推荐 精确渲染 </> } /> </> ); // 第三步内容 const thirdStepRender = ( <> <ModelRenderStyleCategoryGrid ref={styleCategoryGridRef} categoryList={styleCategoryList} onCategoryListChange={(list) => { setStyleCategoryList(list); }} secondCategoryExtra={[ secondCategoryPreciseRendering( 'https://gd-hbimg.huaban.com/d113fdba55b570c14f9e6dd85053e20fe66e59f5cd9c6-KWo2yS_fw1200webp', ), secondCategoryPreciseRendering( 'https://gd-hbimg.huaban.com/4d623892958842956954557d10427f47f7331c3bcfbdc-Xa8fgu_fw1200webp', ), ]} hideActive={preciseRender} onSecondCategoryChange={() => { setPreciseRender(false); }} scenarioKey={scenarioKey} /> {!preciseRender || (scenarioKey !== 'indoor' && ( <> 更多设置 上传风格参考图和添加更多设置可以定制化生成对应风格,进一步加强生成图的风格准确性,此处做选填。 <Collapse ghost expandIconPosition="end"> <UploadImageCard> {() => <UploadImageCard.Card hideDeleteBtn={false} ref={styleImageCardRef} />} </UploadImageCard> <ThemeConfigProvider themeConfigs={{ JKJL: { textArea: { borderColor: '#dfdfdf', borderWidth: '1px', }, segmented: { '--border-width': '1px', '--border-color': '#dfdfdf', } as CSSProperties, }, }} > <AiToolBlockItem title="描述词"> <ThemeTextArea placeholder="写下你的绘画想法和创意" value={description} onChange={(e) => { setDescription(e.target.value); }} /> </AiToolBlockItem> <AiToolBlockItem title={ {t('AiTools-Draw-ControlNet-BaseImage-WREs5')} <QuestionCircleOutlined style={{ marginLeft: 4 }} onClick={() => { materialIntroduceModalRef.current?.setModalStatus('INTRODUCE'); }} /> } extra={ <ThemeSegmented block style={{ width: 180 }} value={lockingMaterialType} options={lockingMaterialList.map((item) => ({ label: t(item.labelKey), value: item.value, }))} onChange={(item) => { setLockingMaterialType(item.value); }} /> } /> </ThemeConfigProvider> </Collapse> ; </> ))} </> ); // 生成参数弹窗 const generateParamsContent = ( <ToggleGenerateInfoPanelItem title="创意描述"> {() => { return ( {description || '无'} ); }} </ToggleGenerateInfoPanelItem> <ToggleGenerateInfoPanelItem title="创作类目" description={generateParams.styleAlias?.join('/')} /> <ToggleGenerateInfoPanelItem title="空间位置" description={ spatialPositionConfig[styleCategoryList[spatialCategoryIndex]?.mid || '']?.[ selectPositionIndex ].name || '' } /> <ToggleGenerateInfoPanelItem title="底图"> {(imageCardClassName) => { return ( <Image src={generateParams.baseImage} preview width="100%" height={154} style={{ objectFit: 'contain', }} /> ); }} </ToggleGenerateInfoPanelItem> {generateParams.styleImage && ( <ToggleGenerateInfoPanelItem title="参考图"> {(imageCardClassName) => { return ( <Image src={generateParams.styleImage} preview width="100%" height={154} style={{ objectFit: 'contain', }} /> ); }} </ToggleGenerateInfoPanelItem> )} <ToggleGenerateInfoPanelItem title="材质锁定" description={t(LockingMaterialTypeEnum[lockingMaterialType || 'OFF'])} /> ); return ( <> <ToolVerticalIntroduceLayoutPC2 toolName={modelRenderToolName} description="一键AI渲染酷家乐室内设计模型,比传统渲染方式更加真实,细腻,高效~支持多种室内风格渲染!" show={introduceLayoutShow} onClickUseBtn={() => { setIntroduceLayoutShow(false); }} content={ <> <ToolVerticalIntroduceLayoutContent1 items={[ { beforeUrl: 'https://gd-hbimg.huaban.com/dc74bbd45daaaf4973d71e64785ed7e2d6cb0eed5ec75-7Gc6aa', afterUrl: 'https://gd-hbimg.huaban.com/63a044eec1c55566f7304e79d1f1c2828c51c8ba9d774-4jCT7E', }, { beforeUrl: 'https://gd-hbimg.huaban.com/ffefde120630092f0244bf346c1d974e51e5dd9bb5fe2-NvzNpK', afterUrl: 'https://gd-hbimg.huaban.com/2d776cae122ab64c90697906540a706664ce21809d1e6-XyYWf1', }, { beforeUrl: 'https://gd-hbimg.huaban.com/6519e79f2c37ee2a1b75025376b10f6d574edfc4f0d17-8ReO7g', afterUrl: 'https://gd-hbimg.huaban.com/82c0c13e8abcb63243697acde385fc569b9b3fd5ba214-nh471F', }, ]} /> </> } /> <UploadImageCard> {(uploadImage) => ( <> <DrawStepOperateLayoutPC trackToolName={TRACK_MODEL_RENDER_NAME} ref={drawStepOperateLayoutRef} downloadConfig={{ enlargeDownloadOptions, }} items={[ { title: '上传模型底图', subTitle: '大师级渲染,从上传底图开始!', content: ( <UploadImageCard.Card style={{ minHeight: '100%', height: 'auto', }} ref={baseImageCardRef} onUploadImageChange={onBaseImageChange} enableKjlUpload uploadImageIcon={{ customUploadBtn: (className) => { return ( { imageSelectorWrapModalRef.current?.setModalStatus( 'SELECT_MODAL', ); }} > {t('HuabanUploadBtn-rWrt')} ); }, }} onScreenshotSuccess={(value) => { imageSelectorWrapModalRef.current?.setModalStatus('LEAFER_FRAME'); imageSelectorWrapModalRef.current?.onGenerateFrame({ width: value.width, height: value.height, url: value.largeUrl, }); setTimeout(() => { imageSelectorWrapModalRef.current?.setOperationType('CLIP_FRAME'); }, 600); }} hidden={!!uploadImage} /> <CoolImage placeholder={{ type: 'loadingIcon' }} className={cx('image')} style={{ objectFit: 'contain' }} src={uploadImage?.largeUrl} alt="" /> <IconFont type="micro-icon-edit" className={cx('operator_icon')} onClick={() => { imageSelectorWrapModalRef.current?.setModalStatus('LEAFER_FRAME'); // 画板没有原图信息的时候 先创建画板 const originImageInfo = imageSelectorWrapModalRef.current?.getOriginImgInfo(); if (!originImageInfo?.url && uploadImage) { imageSelectorWrapModalRef.current?.onGenerateFrame({ url: uploadImage?.largeUrl, width: uploadImage.width, height: uploadImage.height, }); } }} /> <IconFont type="micro-icon-trash-can" className={cx('operator_icon')} onClick={() => { baseImageCardRef.current?.setUploadImage(null); imageSelectorWrapModalRef.current?.clearFrame(); }} /> ), beforeNextStep: async () => { if (!baseImageCardRef.current?.uploadImage) { message.warn('请先上传底图'); return false; } return true; }, }, { title: '选择空间位置', subTitle: '选择正确的位置可以确保生成图更准确。', content: secondStepRender, }, { title: '选择渲染风格', subTitle: '选择想要生成的风格大模型,可以让生成结果更偏向自己的喜好。', content: thirdStepRender, }, ]} onStepStart={onStepStart} uploadImage={uploadImage} resultExtra={ <> {/* 快捷使用 */} <KjlResultQuickAccessBox className={cx('quick_access_box')} extraBottomItems={[ { title: '迭代渲染', iconKey: 'micro-icon-iterative-render', onClick: () => { const generateImage = drawStepOperateLayoutRef.current?.generateImageList[ resultImageSelectIndex ]; if (generateImage) { drawStepOperateLayoutRef.current.setShowType('STEP'); drawStepOperateLayoutRef.current.setCurrent(0); baseImageCardRef.current?.setUploadImage({ thumbUrl: generateImage.url, largeUrl: generateImage.url, width: generateImage.width, height: generateImage.height, }); } }, }, ]} /> {/* 参数明细 */} <ToggleGenerateInfoPopover placement="leftTop" className={cx('generate_params_wrap')} content={generateParamsContent} > {(open) => { return <IconFont type={open ? 'micro-icon-close' : 'micro-icon-tip'} />; }} </ToggleGenerateInfoPopover> </> } stepFooterExtra={ <ToolEquityCountWrap toolKey={modelRenderToolKey} showToolName={modelRenderToolName} trackToolName={TRACK_MODEL_RENDER_NAME} ref={toolEquityCountWrapRef} > <ToolBenefitOperator style={{ marginTop: 8, }} toolKey={modelRenderToolKey} trackToolName={TRACK_MODEL_RENDER_NAME} showToolEquityInfo={() => { toolEquityCountWrapRef.current?.showToolEquityInfo(); }} showToolCountUsageIntro={() => { toolEquityCountWrapRef.current?.showToolCountUsageIntro(); }} showToolBuyCount={() => { toolEquityCountWrapRef.current?.showToolBuyCount(); }} /> </ToolEquityCountWrap> } /> <DrawStepOperateLayoutPC trackToolName={TRACK_MODEL_RENDER_NAME} ref={drawStepOperateLayoutRef} downloadConfig={{ enlargeDownloadOptions, }} items={[ { title: '选择模型场景', subTitle: '请根据实际情况选择合适的渲染场景', content: ( <> {jzxzCategoryList.map((item, index) => ( handleScenarioClick(item, index)} > {item.name} <ThemeButton size="large" shape="circle" className={cx('start_btn', { no_active: modelScenarioActiveIndex !== index, })} > {item.name} </ThemeButton> ))} </> ), }, { title: '上传模型底图', subTitle: '大师级渲染,从上传底图开始!', content: firstStepRender(uploadImage), beforeNextStep: async () => { // if (!baseImageCardRef.current?.uploadImage) { // message.warn('请先上传底图'); // return false; // } if (modelScenarioActiveIndex === 1) { return true; } else { drawStepOperateLayoutRef.current?.setCurrent(3); return false; } }, }, { title: '选择空间位置', subTitle: '选择正确的位置可以确保生成图更准确。', content: jzxzSecondStepRender(), }, { title: '选择渲染风格', subTitle: '选择想要生成的风格大模型,可以让生成结果更偏向自己的喜好。', content: thirdStepRender, previousStep: async () => { if (modelScenarioActiveIndex === 1) { return true; } else { drawStepOperateLayoutRef.current?.setCurrent(1); return false; } }, beforeNextStep: () => { return Promise.resolve(false); }, nextStepBtn: ( {/* 生成尺寸 */} <AiToolBlockItem title={t('AiTools-MixedRawImage-Operate-pc-Jcode')}> <DrawSizeControls value={sizeType} list={jzxzComfyUIDrawSizeTypeList} onChange={(item) => { setSizeType(item); }} /> </AiToolBlockItem> {/* 生成张数 */} <AiToolBlockItem title={t('AiTools-Draw-ConfigPopover-GenerateNum-kijAD')} > {modelRenderGenerateCountList.map((item, index) => ( <AiToolVipOptionItem availableType={item.availableType} label={t(item.labelKey)} key={index} active={item.value === generateCounts} onClick={() => { onGenerateCountsChange(item); }} /> ))} </AiToolBlockItem> </AiToolConfigProvider> } > <ThemeButton className={cx('btn_start')} size="large" onClick={onStepStart}> 开始渲染 <IconFont hidden={scenarioKey === 'indoor'} className={cx('icon_down')} type="micro-icon-arrow-down" /> </ThemeButton> ), }, ]} uploadImage={uploadImage} resultExtra={ <> <JzxzResultQuickAccessBox className={cx('quick_access_box')} /> </> } stepFooterExtra={ <ToolEquityCountWrap toolKey={modelRenderToolKey} showToolName={modelRenderToolName} trackToolName={TRACK_MODEL_RENDER_NAME} ref={toolEquityCountWrapRef} > <ToolBenefitOperator style={{ marginTop: 8, }} toolKey={modelRenderToolKey} trackToolName={TRACK_MODEL_RENDER_NAME} showToolEquityInfo={() => { toolEquityCountWrapRef.current?.showToolEquityInfo(); }} showToolCountUsageIntro={() => { toolEquityCountWrapRef.current?.showToolCountUsageIntro(); }} showToolBuyCount={() => { toolEquityCountWrapRef.current?.showToolBuyCount(); }} /> </ToolEquityCountWrap> } /> </> )} </UploadImageCard> {/* 迁移内容的原图片效果图库 */} <ImageSelectorWrapModal ref={imageSelectorWrapModalRef} queryTagImages={{ categoryList: baseImageTagList, introduce: t('AiTools-DecorationDesign-Operate-pc-f4eJ'), modalTitle: t('AiTools-Draw-ControlNet-BaseImage-b2tNh'), iconClassName: cx('style_refer_image'), }} onFinish={onBaseImageFinish} hideDiyDraw /> {/* 酷家乐 */} <AiToolGenerateModal displayType="MASK" className={cx('generate_mask_container')} customerRef={generateComfyUiModalRef} toolKey={modelRenderToolKey} trackToolName={TRACK_MODEL_RENDER_NAME} request={requestComfyUIDrawGenerate} speedupKey={modelRenderSpeedupKey} pollingConfig={{ processingType: 'COMFYUI_COMPOSE', imageDetectMode: 'NONE', }} onGenerateSuccess={onComfyUiGenerateSuccess} onCancel={() => { // 蒙层关闭 回到进度展示 drawStepOperateLayoutRef.current?.setShowType('STEP'); }} /> {/* 精确渲染 */} <AiToolGenerateModal displayType="MASK" className={cx('generate_mask_container')} customerRef={generateComfyUiPreciseRenderingModalRef} toolKey={modelRenderToolKey} trackToolName={TRACK_MODEL_RENDER_NAME} request={requestModelRender} speedupKey={modelRenderSpeedupKey} pollingConfig={{ processingType: 'COMFYUI_COMPOSE', imageDetectMode: 'NONE', }} onGenerateSuccess={onComfyUiGenerateSuccess} onCancel={() => { // 蒙层关闭 回到进度展示 drawStepOperateLayoutRef.current?.setShowType('STEP'); }} /> <MaterialIntroduceModal ref={materialIntroduceModalRef} /> <GenerateCountLimitModal ref={generateCountLimitModalRef} open={limitModalOpen} onCancel={() => { setLimitModalOpen(false); }} /> </> ); }; export default ModelRenderOperatePC;import { AiToolImageCoverCard, AiToolSquareCoverCard } from '@aiComponents/CardItems'; import AiToolGridList from '@aiComponents/GridList'; import Loading from '@components/Loading'; import ProductAuth from '@components/ProductAuth'; import { requestAdvanceDrawSubStyleConfigCategory } from '@services/advanceDraw/config.ts'; import { useMount } from 'ahooks'; import classNames from 'classnames/bind'; import { floor } from 'lodash'; import type { Dispatch, ReactNode, SetStateAction } from 'react'; import { useCallback } from 'react'; import { forwardRef, useImperativeHandle, useMemo, useRef, useState } from 'react'; import Media from 'react-media'; import type { GetAdvanceDrawLeafGenerateArgsByMidsType } from '@/pages/AiTools/AdvanceDraw/utils.ts'; import { getComfyUIDrawLeafGenerateArgsByMids } from '@/pages/AiTools/AdvanceDraw/utils.ts'; import { useStore } from '@/store/createStore.ts'; import type { AdvanceDrawStyleCategoryItem } from '@/types/advanceDraw'; import styles from './index.module.less'; const cx = classNames.bind(styles); export type ModelRenderStyleCategoryGridRef = { setFirstCategoryIndex: Dispatch<SetStateAction<number>>; setSecondCategoryRequesting: Dispatch<SetStateAction<boolean>>; getComfyUIDrawLeafGenerateArgsByMids: () => GetAdvanceDrawLeafGenerateArgsByMidsType; // 二级类目名称获取 getSelectedSecondCategoryName: () => string; // 重置二级类目 resetSecondCategoryIndex: () => void; }; type Props = { categoryList: AdvanceDrawStyleCategoryItem[]; onCategoryListChange: (list: AdvanceDrawStyleCategoryItem[]) => void; secondCategoryExtra: ReactNode[]; hideActive: boolean; onSecondCategoryChange: (index: number) => void; // 场景key值 scenarioKey: string; }; // 二级类目最小宽度 const MIN_SECOND_CATEGORY_CARD_WIDTH = 150; // 二级类目间距 const SECOND_CATEGORY_GRID_GAP = 16; /** * 模型渲染风格类目 */ const ModelRenderStyleCategoryGrid = forwardRef<ModelRenderStyleCategoryGridRef, Props>( ( { categoryList, onCategoryListChange, secondCategoryExtra, hideActive, onSecondCategoryChange, scenarioKey, }, ref, ) => { const { productType } = useStore((state) => state.productInfo); const secondCategoryRef = useRef<HTMLDivElement | null>(null); // 二级类目 列数 const [secondCategoryGridColumns, setSecondCategoryGridColumns] = useState(0); // 一级类目索引 const [firstCategoryIndex, setFirstCategoryIndex] = useState(0); // 二级类目索引 const [secondCategoryIndex, setSecondCategoryIndex] = useState(0); // 二级类目请求中 const [secondCategoryRequesting, setSecondCategoryRequesting] = useState(false); // 所有层级分类列表 const { secondCategoryList } = useMemo(() => { if (!categoryList.length) { return { secondCategoryList: [], }; } // 二级类目列表 const secondCategoryList = categoryList[firstCategoryIndex]?.children || []; return { secondCategoryList, }; }, [categoryList, firstCategoryIndex, secondCategoryIndex]); // 计算列数 const calculateColumns = useCallback(() => { if (secondCategoryRef.current?.offsetWidth) { const secondContainerWidth = secondCategoryRef.current?.offsetWidth; // 计算列数 setSecondCategoryGridColumns( floor( (secondContainerWidth + SECOND_CATEGORY_GRID_GAP) / (MIN_SECOND_CATEGORY_CARD_WIDTH + SECOND_CATEGORY_GRID_GAP), ), ); } }, []); useMount(() => { calculateColumns(); }); useImperativeHandle(ref, () => ({ setFirstCategoryIndex, setSecondCategoryRequesting, getComfyUIDrawLeafGenerateArgsByMids: () => { const firstCategory = categoryList[firstCategoryIndex]; const secondeCategory = firstCategory.children?.[secondCategoryIndex]; const selectMids = [firstCategory.mid]; if (secondeCategory) { selectMids.push(secondeCategory.mid); } return getComfyUIDrawLeafGenerateArgsByMids(categoryList, selectMids); }, getSelectedSecondCategoryName: () => { if (categoryList.length > firstCategoryIndex) { const secondCategoryList = categoryList[firstCategoryIndex]?.children || []; if (secondCategoryList.length > secondCategoryIndex) { return secondCategoryList[secondCategoryIndex]?.name || ''; } } return ''; }, resetSecondCategoryIndex: () => { setSecondCategoryIndex(0); }, })); console.log('setFirstCategoryIndex', firstCategoryIndex); return ( <> {categoryList.map((value, index) => ( { setFirstCategoryIndex(index); setSecondCategoryIndex(0); if (!value.children && value.justCategory) { try { setSecondCategoryRequesting(true); const subCategoryList = await requestAdvanceDrawSubStyleConfigCategory( value.mid, ); // 替换当前类目下的子类目信息 onCategoryListChange( categoryList.map((value1, index1) => { if (index1 === index) { return { ...value1, children: subCategoryList, }; } return value1; }), ); setSecondCategoryRequesting(false); } catch (e) { setSecondCategoryRequesting(false); console.error(e); } } }} > {value.name} ))} <Media queries={{ small: '(max-width: 768px)', large: '(min-width: 769px)', }} > {(matches) => ( <> {matches.large && ( <> {secondCategoryRequesting && <Loading height={200} iconWidth={100} />} {secondCategoryExtra[firstCategoryIndex]} {secondCategoryList.map((value, index) => ( { setSecondCategoryIndex(index); onSecondCategoryChange(index); }} > <AiToolSquareCoverCard coverUrl={value.coverUrl} extra={{value.name}} /> ))} </> )} {matches.small && ( <> {secondCategoryRequesting && <Loading height={200} iconWidth={100} />} {/* {secondCategoryList.map((value, index) => (*/} {/* {*/} {/* setSecondCategoryIndex(index);*/} {/* onSecondCategoryChange(index);*/} {/* }}*/} {/* >*/} {/* <AiToolSquareCoverCard*/} {/* coverUrl={value.coverUrl}*/} {/* extra={{value.name}}*/} {/* />*/} {/* */} {/* ))}*/} <> <AiToolGridList list={secondCategoryList} renderItem={(item, index) => { return ( <AiToolImageCoverCard label={item.name} active={index === secondCategoryIndex} coverUrl={item.coverUrl} onClick={() => { setSecondCategoryIndex(index); onSecondCategoryChange(index); }} /> ); }} /> </> </> )} </> )} </Media> </> ); }, ); export default ModelRenderStyleCategoryGrid; 为什么第一次点击的时候styleCategoryGridRef.current?.setFirstCategoryIndex(index);没有生效firstCategoryIndex依旧是默认的0,第二次点击就生效了

最新推荐

recommend-type

智能监督产品硬件设计资料.zip

智能监督产品硬件设计资料.zip
recommend-type

PKID查壳工具最新版发布,轻松识别安卓安装包加壳

根据提供的文件信息,我们可以详细解读以下知识点: ### PKiD(查壳)工具介绍 #### 标题分析 - **PKiD(查壳)**: 这是一个专门用于分析安卓安装包(APK文件)是否被加壳的应用程序。"查壳"是一种用于检测软件是否被保护层(即“壳”)包裹的技术术语。加壳是一种常见的软件保护手段,用于隐藏真实的代码逻辑,防止恶意逆向分析。 - **RAR格式文件**: 文件使用了RAR格式进行压缩,这是WinRAR软件用于文件压缩和解压缩的专有格式。 #### 描述分析 - **ApkScan-PKID查壳工具.zip**: 这指的是一款名为ApkScan的工具,它包含了PKID查壳功能。该工具被打包成ZIP格式,便于用户下载和使用。 - **安卓安装包**: 这是指Android平台的应用程序安装包,通常以APK作为文件扩展名。 - **加壳检测**: PKID查壳工具用于检测APK文件是否被加壳,加壳是一种常见的软件保护技术,用于加密和保护软件免遭逆向工程。 - **脱壳测试**: 如果检测到加壳,脱壳测试将用于尝试去除或绕过保护层,以便进行安全分析、调试或修改程序。 #### 标签分析 - **查壳**: 再次强调了工具的主要功能,即检测APK文件中的加壳情况。 - **最新版**: 表示这个文件是PKID查壳工具的最新版本。 - **PKID**: 这是工具的核心名称,代表着该软件的主要功能和用途。 #### 文件列表分析 - **PKiD(查壳).exe**: 这是一个可执行文件,说明PKID查壳工具是一个独立的应用程序,用户可以通过双击此文件直接运行程序,而无需安装。 ### 技术背景 #### 查壳工具的工作原理 查壳工具通常通过分析APK文件的头部信息、资源文件和代码段来检测加壳。它可能会检查PE文件格式的特定区域(APK基于DEX,但PE检查的概念相似),这些区域在加壳过程中可能会被特定的代码模式、字符串或签名标记。例如,某些壳会在文件头部加入特定的字符串,或者修改方法计数等信息。 #### 加壳技术 加壳技术通常用于防止软件被轻易反编译或逆向工程。它可以阻止潜在的窃取知识产权、绕过付费或防止代码分析等。加壳过程包括加密和压缩原始代码,然后在运行时解压和解密代码以供执行。 #### 脱壳技术 脱壳技术是指绕过或移除软件保护壳的过程。这通常需要对壳的工作原理有深入了解,并且需要一定的逆向工程技能。脱壳过程可能包括识别壳的签名、分析保护机制、修改代码和重定位等步骤。 #### 安全测试与逆向工程 查壳工具对于安全测试和逆向工程人员来说是非常重要的工具。它们可以帮助识别软件是否被加壳,从而决定是否需要进行脱壳操作以便深入分析软件的安全漏洞或版权问题。 #### 使用场景 - **安全测试**: 安全工程师在对移动应用程序进行安全评估时,需要确认是否有必要进行脱壳处理。 - **逆向工程**: 开发人员可能需要逆向工程某个应用,以更好地理解其工作原理或为了兼容性问题进行修改。 - **软件保护**: 对于软件开发者而言,了解常见的加壳和脱壳技术有助于更好地保护自己的应用免遭未授权的篡改和分析。 ### 结论 了解和掌握PKID查壳工具的使用对于任何需要对APK文件进行安全性分析的专业人士来说都是基础且关键的技能。该工具提供了一种快速判断软件是否加壳的方法,而且在发现壳的情况下,还可以推测出壳的来源公司,这对于后续的分析和处理提供了便利。然而,值得注意的是,进行脱壳操作往往需要对原始程序代码进行逆向工程,这在很多情况下可能涉及法律和道德问题,因此在使用此类工具时,必须确保其合法性和符合道德规范。
recommend-type

【心理学火柴人视频制作秘籍】:Coze工作流全攻略,带你从入门到精通

# 1. 心理学火柴人视频制作概述 ## 1.1 创作心理学火柴人视频的动机 心理学火柴人视频作为一种富有创意的视觉传达方式,不仅能够将复杂的心理学理论变得生动和易于理解,而且还能为观众提供轻松愉悦的学习体验。这种视频通常采用简化的角色——火柴人,通过动画的形式演绎心理学相关的内容,使得原本抽象的理论变得具体、形象。 ## 1.2 火柴人视频的普及与应用 随着互联
recommend-type

frame.onload不执行?

<think>在解决`frame.onload`不执行的问题时,我们需要考虑多种可能的原因和解决方案。下面我将详细解释这个问题,并提供相应的代码示例。##可能的原因及解决方案###1.事件绑定时机不正确如果我们在设置`src`属性之后再绑定`onload`事件,可能会错过事件的触发(因为资源可能已经加载完成)。所以,我们应该在设置`src`之前绑定`onload`事件。###2.资源加载失败如果资源加载失败,`onload`事件可能不会触发,而触发`onerror`事件。因此,我们需要同时监听`onerror`事件。###3.iframe内容为空如果我们使用`document.write`来设
recommend-type

一键关闭系统更新的工具介绍

从给定的文件信息中我们可以分析出几个相关的知识点,以下是详细说明: 【标题】“系统禁止更新工具.7z”暗示着这个压缩文件内包含的可能是一款软件工具,其主要功能是阻止或禁止操作系统的更新。这种工具可能针对的是Windows、Linux或者其他操作系统的自动更新功能。一般来说,用户可能出于稳定性考虑,希望控制更新时间,或者是因为特定的软件环境依赖于旧版本的系统兼容性,不希望系统自动更新导致兼容性问题。 【描述】“一健关闭系统更新”说明了该工具的使用方式非常简单直接。用户只需通过简单的操作,比如点击一个按钮或者执行一个命令,就能实现关闭系统自动更新的目的。这种一键式操作符合用户追求的易用性原则,使得不太精通系统操作的用户也能轻松控制更新设置。 【标签】“系统工具”表明这是一个与操作系统紧密相关的辅助工具。系统工具通常包括系统清理、性能优化、磁盘管理等多种功能,而本工具专注于管理系统更新,使其成为系统维护中的一环。 【压缩包子文件的文件名称列表】“系统禁止更新工具”是压缩包内的文件名。由于文件格式为“.7z”,这说明该工具采用了7-Zip压缩格式。7-Zip是一款开源且免费的压缩软件,支持非常高的压缩比,并且能够处理各种压缩文件格式,如ZIP、RAR等。它支持创建密码保护的压缩文件和分卷压缩,这在需要转移大量数据时特别有用。然而在这个上下文中,“系统禁止更新工具”文件名暗示了该压缩包内只包含了一个程序,即专门用于关闭系统更新的工具。 根据标题和描述,我们可以推测该工具可能的实现机制,例如: 1. 修改系统服务的配置:在Windows系统中,可以通过修改Windows Update服务的属性来禁用该服务,从而阻止系统自动下载和安装更新。 2. 修改注册表设置:通过编辑Windows注册表中的某些特定键值,可以关闭系统更新功能。这通常涉及到对HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate和HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU等路径下的设置进行修改。 3. 使用第三方软件:某些第三方工具提供了一键禁用系统更新的功能,通过修改操作系统的相关文件和配置来实现更新的禁用。这包括阻止Windows Update的运行、拦截更新下载等。 该工具的使用可能带来一些后果,比如系统安全风险的增加、系统漏洞得不到及时修复以及可能违反某些软件许可协议。用户在使用这类工具时应该清楚这些潜在的影响,并自行承担相应的风险。 总结来说,该“系统禁止更新工具”可以视为一个针对特定用户需求,尤其是企业用户或个人用户中对系统稳定性有较高要求的人群,提供的一个便捷的解决方案。它通过直接修改系统设置来禁止操作系统自动更新,但用户在使用此工具时需要谨慎,因为这可能会带来系统安全和稳定性的风险。
recommend-type

罗技GHUB驱动21.03.24版自定义设置与性能优化:专家级使用技巧

# 摘要 本文综合介绍了罗技GHUB驱动的安装、自定义设置、性能优化、进阶应用以及故障排除。通过对GHUB软件界面和功能的详细介绍,阐述了硬件识别、宏命令创建以及游戏特有设置的定制。同时,文中探讨了性能调整的理论基础,并提供实践中针对网络延迟和数据传输优化的具体技巧。进一步探讨了高级个性化配置和第三方软件集成的策略,最后针对
recommend-type

RX72M单片机读取差分编码器,输入输出滤波,差分转单端后将5V电压转为3.3v输入给单片机

<think>嗯,我需要帮助用户解决关于RX72M单片机读取差分编码器的问题。用户的需求很明确:如何用RX72M单片机读取差分编码器,实现输入输出滤波,将差分信号转为单端信号,并进行5V到3.3V的电平转换。首先回顾用户之前的几个引用。引用1提到ADC的差分输入模式,这让我想到用户可能需要处理模拟信号,但差分编码器通常是数字信号。用户的主要需求集中在数字信号处理,比如正交编码器的脉冲信号。因此,可能需要参考引用1中的差分输入设置,但注意这里适用的是数字接口而非ADC。引用2关于74HC245和SN74LVC1T45DBVR芯片的内容非常有价值。这两个都是电平转换方案,尤其是SN74LVC1T4
recommend-type

鼎捷易飞ERPV9.0委外进货单批量导入解决方案

根据提供的文件信息,我们可以从标题、描述、标签以及压缩包文件列表中提取以下知识点: 1. 委外进货单批量导入程序及模版格式 标题提到的“委外进货单批量导入程序”指的是一个软件应用,其主要功能是允许用户批量地将委外进货数据导入到ERP系统中。批量导入通常是指在ERP系统中不需要逐条手动输入数据,而是通过预先定义好的模板,一次性将大量数据导入系统。这样的程序对于提高工作效率、减少重复性工作以及避免人为错误具有重要意义。 2. 鼎捷易飞ERPV9.0 描述中提到的“鼎捷易飞ERPV9.0”是一个特定版本的ERP系统,由鼎捷软件公司开发。ERP(Enterprise Resource Planning,企业资源计划)系统是一种用于整合企业内部所有资源信息,实现信息流、物流、资金流、工作流的高度集成和自动化管理的软件。ERPV9.0是该系列产品的版本号,表明该程序和文件模板是为这一特定版本的ERP系统设计。 3. .NET C#源代码 标题中的“.NET C#源代码”表示程序是使用.NET框架和C#语言开发的。.NET是微软公司开发的一个软件框架,用于构建和运行Windows应用程序。C#(读作“C Sharp”)是.NET框架下的一种编程语言,具有面向对象、类型安全和垃圾回收等特点。开发者可能提供了源代码,以便企业用户可以自行修改、调整以满足特定需求。 4. 使用方法和步骤 描述中详细说明了程序的使用方法: - 首先编辑模版格式数据,即将需要导入的数据按照特定的格式要求填写到模板中。 - 然后在程序中选择单别(可能指的是单据类型)和日期等条件。 - 点击“导入数据”按钮,程序将提示用户选择含有数据的模板文件。 - 程序会进行数据校验,以确保数据的正确性。校验规则是特定的,如果用户不需要特定的校验条件,可以在程序中直接删除这部分代码。 - 最后,数据校验无误后,程序可以生成相应的进货单据。 5. 自定义程序和模板 在标签中提到的“易飞ERP委外进货单导入程序”、“委外进货单导入程序”和“易飞ERP自定义程序”表明,所提供的程序可以根据用户的特定需求进行定制。同时,模板格式的使用,也意味着用户可以根据自己的业务需要和ERP系统的要求调整模板内容,以便更好地适应数据导入过程。 6. 压缩包子文件的文件名称列表 提供的压缩包包含两个文件: - “委外进货单批量导入格式.xls”指的是一个Excel格式的文件,这个文件应该是一个符合要求的导入模板,用户需要按照这个模板的格式来准备需要导入的数据。 - “委外入库导入(源代码).zip”是一个包含源代码的压缩文件,其中可能包含程序的完整源代码,也可能仅包含与导入功能相关的部分代码。 7. 文件列表和数据导入流程 通过文件列表可以理解整个数据导入流程: - 用户首先需要准备好数据,并将其按照“委外进货单批量导入格式.xls”模板中的要求填入相应的数据。 - 用户然后使用“委外入库导入(源代码).zip”中的程序,根据程序使用说明进行配置。 - 最后,用户通过程序界面导入整理好的Excel模板文件,程序会自动处理数据导入的过程,并进行必要的数据校验,最终生成所需的进货单据。 以上总结的知识点涵盖了该压缩包文件的内容、用途、技术细节以及操作步骤,为了解和使用该委外进货单批量导入程序提供了充分的信息。
recommend-type

罗技GHUB驱动21.03.24版更新日志详细解读:驱动改进点全掌握

# 摘要 罗技GHUB驱动自发布以来,不断更新以提升兼容性、用户界面体验、性能和功能。本文主要概述了罗技GHUB驱动的更新历程,特别聚焦于21.03.24版的改进点,包括对新硬件的支持、现有设备兼容性的增强、界面设计和交互体验的优化。此外,本文深入探讨了该版本新增与改进的功能及其具体使用方法,并提供了故障排除指南。通过与旧版驱
recommend-type

<Tag color={value} onMouseDown={onPreventMouseDown} closable={closable} onClose={onClose} style={{ marginInlineEnd: 4 }} > {label} </Tag> 我想让他的color为随机

<think>我们正在讨论如何为一个React的Tag组件设置color属性为随机颜色。根据引用[1],我们可以创建一个样式对象,但这里我们需要动态生成随机颜色。我们可以考虑在组件内部生成随机颜色的逻辑,然后将这个随机颜色应用到样式上。思路:1.在组件的函数内部(如果使用函数组件)或类组件的render方法中,生成一个随机颜色。2.将这个随机颜色作为样式属性(例如:color或backgroundColor)的值。然而,需要注意:引用[2]提到了性能优化,即如果组件不需要根据外部状态变化重新渲染,可以使用shouldComponentUpdate返回false。但这里我们每次都需要随机颜色,所