ST_FUNC開発日記

建築構造設計Excelアドイン開発の記録

構造計算部分のライブラリ化 その2

引き続き下記サイトを参考に進めていく。

zenn.dev

モジュールを実装する

srcディレクトリを作り、中にindex.tsとsec/build-h-function.tsを作成する。

ファイル名がキャメルケース、チェーンケース、クラスと同じパスカルケース等いろいろな説があるんだけど、どれが推奨なんだろう?

ChatGPTさん曰く

TypeScriptのファイル名の推奨されるケースは、通常、キャメルケースまたはパスカルケースです。これは、一般的なJavaScriptの慣習に従っています。

  • キャメルケース: someFile.ts
  • パスカルケース: SomeFile.ts

これらのケースは、通常、変数や関数などの識別子の命名にも使用されます。ただし、プロジェクト内で一貫性を保つことが重要です。プロジェクトやチームのコーディングスタイルガイドに従ってください。

とのことなので、とりあえずキャメルケースにする。

断面性能を計算する関数を、SecBuildHFunctionクラスに入れる。(SecBuildHというクラスはインスタンスで使いそうなので、静的な計算式はクラスを分けた)

typescriptってクラスメソッドはfunctionって書かなくてもいいのか。

関数名はこちらの英語を参考に。

英国の鋼材表の英語表現を整理する|Issey Kurokawa

関数名をAとかIyとかにしなかったのは、TypeScriptの命名規約的に小文字表記になるため、断面二次モーメントと断面二次半径の区別がつかないので単語にした。

それぞれのコードを記載。

index.ts

export * from "./sec/build-h-function"

build-h-function.ts

/**
 * 組立H形鋼の断面性能を計算する関数集
 */
export class SecBuildHFunction {
  /**
   * 組立H形鋼の断面積
   * @param a 成 A
   * @param b フランジ幅 B
   * @param t1 ウェブ厚 t1
   * @param t2 フランジ厚 t2
   * @returns 断面積 A
   */
  static build_h_area(a: number, b: number, t1: number, t2: number): number {
    return a * b - (a - 2 * t2) * (b - t1);
  }
//中略
}

組立H形鋼の断面性能を計算するモジュールの作成 · st-func/st-func-ts@7ac434f · GitHub

コード整形

コード整形がされてなかったので、前回やったvscodeの設定をこちらでもを行う。

TypeScriptの設定

まずTypeScriptのインストール

$ npm install typescript

node_moduleフォルダが作成され、package.jsonが更新、新たにpackage-lock.jsonが作られた。細かいことはいったん置いておく。 次にtypescriptの初期化

$ npx tsc --init

tsconfig.jsonというコメントアウトだらけの長いjsonが作成された。ビルドの設定などを行うらしい。

TypeScriptの初期化 · st-func/st-func-ts@353a2b9 · GitHub

参考サイトを見ながら一部修正して、ビルドしてみる。

$ npx tsc

distディレクトリが作成されて、jsのコードが作られた。distは初期設定で.gitignoreに入っているので問題ない。

tsconfig.jsonの修正 · st-func/st-func-ts@7b62b69 · GitHub

さて、この時点でテストインストールとかしてたら全然動かなくて苦労してしまった。パッケージの設定をしてなかったからですね。

パッケージの公開設定

package.jsonと.npmignoreを追加。テストインストールのときにうまく動かなかったのはmainの設定にdist/がついていなかったのがいけないようだ。

パッケージの公開設定 · st-func/st-func-ts@24b512d · GitHub

パッケージの読み込み

さて、パッケージができたので、いよいよアドイン側から読み込む。

参考サイトだとnpmにアップロードしてるけど、バージョンがどしどし上がってしまうと微妙な気がする。

npmはローカルからもインストールできるようなので、ローカルからインストールしてみる。

相対パスでもよいようなので、st-func-tsのリポジトリをst_func_addinと同じ階層において、

$ npm install ../st-func-ts

でインストールする。

なお、st-func-tsはdistがgitignoreされているので、gitからcloneしたときは、st-func-tsの中で

$ npm install
$ npm run build

が必要。

ちなみに、ローカルインストールの場合、シンボリックリンクになるようだ。動作が不思議でびっくりしたけど、開発中は即反映されて便利だな。

パッケージがインストールされたので、断面性能関数をパッケージを使って計算してみる。

クラスをインポートして、クラスメソッドで計算させる。

import { SecBuildHFunction } from "@st-func/st-func-ts";
/**
 *  組立H形鋼の断面性能。
 * @customfunction secBuildH secBuildH
 * @param propertyType 表示したい断面性能のタイプ
 * @param a 成 A
 * @param b フランジ幅 B
 * @param t1 ウェブ厚 t1
 * @param t2 フランジ厚 t2
 * @returns 断面性能
 */
export function secBuildH(propertyType: string, a: number, b: number, t1: number, t2: number): number {
  switch (propertyType) {
    case "A":
      return SecBuildHFunction.build_h_area(a, b, t1, t2);
    case "Iy":
      return SecBuildHFunction.build_h_second_moment_of_area_y(a, b, t1, t2);
    case "Iz":
      return SecBuildHFunction.build_h_second_moment_of_area_z(a, b, t1, t2);
    default: {
      let error = new CustomFunctions.Error(
        CustomFunctions.ErrorCode.invalidValue,
        `[${propertyType}]は正しくないタイプ名です`
      );
      throw error;
    }
  }
}

いざ、npm build+npm run start:webで、よし動いた!と思ったらIyの計算結果が違う。 パッケージを作るときにコードのミスがあったようだ。

static build_h_second_moment_of_area_y(
    a: number,
    b: number,
    t1: number,
    t2: number
  ): number {
    return (b * a ** 3 - (b - t1) * (1 - 2 * t2) ** 3) / 12.0;
  }

ここは1-2*t2になっているけどa-2*t2だな。

こういうこともあるので、次はユニットテストを導入したい。

secBuildHの計算をパッケージ利用に変更 · st-func/st_func_addin@78af5d7 · GitHub