Casio Python - CGモデルとFXモデルのPythonモードの違い

Casioグラフ関数電卓の Python を使ってみる
- CGモデルとFXモデルのPythonモードの違い
<目次>
初版:2020/10/25
▲ 前の記事 - 13. 10進数除算の出力と精度 | ▼ 次の記事 - 15. RGB値による色設定14. CGモデルとFXモデルのPythonモードの違い
これまでの記事では、fx-CG50 OS3.40 以降を前提として Casio Python のスクリプトを検討してきました。
Casio Python で使い勝手の良いスクリプトに仕上げるには、casioplot モジュールの存在が不可欠で、グラフィック画面 (描画画面) へテキストやドットを自由に出力することがポイントになります。それをサポートするためにユーザーモジュール u.py も作ってきました。
2020年10月15日に公開されたOSアップデートファイルにより、カラー高精細液晶モデル fx-CG50 のOSがアップデート可能になりました。これと同時に、2つのモノクロ液晶モデルのOSがアップデートされ casioplot モジュールが追加されました。
- fx-CG50 OS3.40 から OS3.50 にアップデート ⇒ アップデートサイトはここを参考に
- fx-9750GIII OS3.21 から OS3.40 にアップデート ⇒ アップデートサイトはここを参考に
- fx-9860GIII OS3.21 から OS3.40 にアップデート ⇒ アップデートサイトはここを参考に
さて、Pythonモード搭載のモノクロ液晶モデル (fx-9750GIII, fx-9860GIII) をここでは FXモデルと、そして高精細カラー液晶モデル (fx-CG50) を CGモデルと呼ぶことにします。
結論から言えば、FXモデルの PythonモードはCGモデルよりも制限があることが判りました。
この違いは、これまでにCGモデルで作ったスクリプトをFXモデルに移植する作業を行う際に見つかりました。
14.1 CGモデルからFXモデルへのスクリプトの移植
CGモデルで作成した下記2つのスクリプトをFXモデルに移植しました。以下のスクリプトファイルは、 CGモデルとFXモデルの両方に対応し、異なる解像度の画面で互換動作します。
▶ モンテカルロ法 ver 3.1 - montec31.py ⇒ ダウンロード
▶ 15桁対応高速素因数分解 ver 7.1 - FactorG7.py ⇒ ダウンロード
▶ ユーザーモジュール ver 1.5 - u.py ⇒ ダウンロード
※ モンテカルロ法 - montec31.py - 1000回実行時の出力画面


FXモデルでは1ドットが大きいので、1000回実行時のドットでかなり画面を埋めてしまいます。
※ 15桁高速素因数分解 ver 7.1 - FactorG7.py - 素因数分解の出力画面


CGモデルでは見やすくするために横の線分を描画しますが、FXモデルでは線分描画をせずにフォントを見やすくしました。そもそもFXモデルでは Mediumサイズのフォントは見づらいですね。
この2つのスクリプト例で CGモデルとFXモデルの両方に対応するために、以下の2点に留意しました。
1. CGモデルかFXモデルかを判定する。
2. モデル判定結果に応じて、テキストやドットの表示位置を場合分けする。
14.1.1 CGモデルからFXモードへのスクリプト移植のポイント
CGモデルとFXモデルの主な違いは、出力するグラフィック画面の解像度、つまり縦と横のドット数です。
- CGモデル: 384 ドット × 192 ドット
- FXモデル: 128 ドット × 64 ドット
従って、画面の中で同じ位置にテキストやドットを表示するためには、CGモデルとFXモデルでは指定する座標が異なります。そこで、CGモデルで作ったスクリプトをFXモデルで動作させるには座標の設定を変更すれば良いことになります。
CGモデルでの座標 (X, Y) は、FXモデルで (X//3, Y//3) と記述すれば、ほぼ同じ位置に表示できます。
※ 演算子 // は、X//3 としたとき X を3で割った商、つまり除算結果の整数部を得る Python の演算子です。
1つのスクリプトで、CGモデルでもFXモデルでも正しく動作させるためには、CGモデルかFXモデルかを判定する必要があります。判定できれば、if 文で場合分けすれば目的を達成できます。
14.1.2 CGモデルとFXモデルの判定方法
この解像度の違いを利用して、CGモデルかFXモデルかを判定できます。casioplot モジュールで提供されている get_pixel() 関数を使う方法を考えました。get_pixel() は指定した座標の色を返します。
get_pixel() は、指定した座標が画面の範囲外の場合は None を返します。そこで、CGモデルでは存在するがFXモデルでは存在しない座標、例えば (128, 64) を指定すると、CGモデルでは意味のある値を返しますが、FXモデルでは None を返すことを利用します。
管理人は以下の関数を作って利用しました。
モデル判定関数
def isCG():
if get_pixel(128,64)==None:
return 0
else:
return 1
CGモデルで isCG() を実行すると1を返し、FXモデルでは0を返します。
14.2 FXモデルのPythonモードの制限 - バッファサイズ
上で紹介したスクリプト FactorG7.py, u.py は、スクリプトをFXモデルで開こうとすると、エラーメッセージ "Invalid Data Size" が表示されスクリプトを開けず、FXモデル上で編集ができません。これは、CGモデルにはない FXモデルの制限 です。編集を行うには、一旦 fx-CG50に転送するか、PCに転送して編集する手間が必要です。
14.2.1 編集できるスクリプトファイルの行数の制限
CGモデルでは300行を超えるとスクリプトファイルを開けず、FXモデルでは150行を超えるとスクリプトファイルを開けません。
従って、上の3つのスクリプトファイルのうち、FactorG7.py と u.py は、FXモデルで開けず、電卓上で編集できません。fx-CG50 かPCに転送してエディタで編集してから電卓で動作確認を行う必要があり、かなり不便です。
※ オープンできるスクリプトファイルの行数は、FXモデルは最大150行、CGモデルの最大300行の半分に制限
▶ u.py への対策
u.py からコメントの1部を削除して150行以内にしてFXモデルで開いて編集できるようにした ufx.py も同梱しました。
▶ FactorG7.py への対策
FactorG7.py は、必要なスクリプト自体の行数が多く、コメント削除で150行以内にできないので、FXモデルで開いて編集できません。fx-CG50 かPCへ転送してエディタで編集するしかありません。
14.2.2 print() 出力のスタックサイズ
以下のスクリプトをCGモデルとFXモデルで実行してみます。
n=123
lst=list(range(n))
print(lst)
CGモデルでは n=123 までは print() でリスト lst[] を出力できますが、123を超えると MemoryEror となります。
FXモデルでは n-66 まではリストlst[] を出力できますが、66を超えると MemoryError となります。
※ print() 出力のスタックは、CGモデルは123バイト、FXモデルは66バイトとCGモデルの約半分に制限
14.2.3 Shell 画面出力のスタックサイズ
以下のスクリプトをCGモデルとFXモデルで実行してみます。
n=200
for i in range(n):
print(str(n))
CGモデルでは n=200 までは shell 画面に全て表示されますが、200を超えても 200行しか出力されず、スタックの底のデータは表示されません。
FXモデルでは n=100 までは shell 画面に全て表示されますが、100を超えても 100行しか表示されず、スタックの底のデータは表示されません。
※ Shell 画面のスタックは、CGモデルは200行、FXモデルは100行とCGモデルの半分に制限
14.3 Casio Python自体の機能の違い
CGモデル (fx-CG50) のOSが 2020年10月15日に OS3.40 から OS3.50 へのアップデートファイルが公開されました。
同じ日に FXモデル (fx-9750GIII と fx-9860GIII) は、OS3.21 から OS3.40 へのアップデートファイルが公開されました。
そこで、CGモデルの OS3.40 と OS3.50 の Casio Python の違いを調べ、次に CGモデルのOS3.50 と FXモデルの OS3.40 の Casio Python の違いを調べます。
14.3.1 CGモデル OS3.40 と OS3.50 の違い
実装されているクラス、オブジェクト、関数は全く同じです。
[SHIFT]-[F4] で現れるカタログ機能で OS3.40 ではリストになかった clear_screen() のみが OS3.50 で追加されました。
14.3.2 CGモデル OS3.50 と FXモデル OS3.40 の違い
実装されているクラス、オブジェクト、関数は全く同じです。
以下のスクリプトで確認できます。
ObjName.py ダウンロード
import builtins
print(repr(builtins))
for i in dir(builtins):
print(i)
print(repr(list))
for i in dir(list):
print(i)
print(repr(dict))
for i in dir(dict):
print(i)
print(repr(set))
for i in dir(set):
print(i)
import casioplot
print(repr(casioplot))
for i in dir(casioplot):
print(i)
import math
print(repr(math))
for i in dir(math):
print(i)
import random
print(repr(random))
for i in dir(random):
print(i)
CGモデルでは全てが出力されますが、FXモデルでは出力スタックが100行に制限されるので、スクリプトを適当にコメントアウトして複数回に分けて出力する必要があります。
FXモデルのPythonモードは、Pythonの開発環境としては制限が強くかなり使いづらいのですが、Casio Pythonとしての機能はCGモデルと同じです。
- 関連記事
-
-
Casio Python - clear_screen() 2020/10/28
-
Casio Python - show_screen() 2020/10/28
-
Casio Python - CGモデルとFXモデルのPythonモードの違い 2020/10/25
-
Casio Python - 10進数除算の出力と精度:高速素因数分解(7) 2020/10/22
-
Casio Python - 入出力 2020/10/20
-